Python3参数传递-忒恶心了吧

Posted codebeyond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3参数传递-忒恶心了吧相关的知识,希望对你有一定的参考价值。

Python参数传递情况没有我想的那么简单。不是非黑即白。

 

1. 不可变对象

2. 可变对象

  (1) 增删

  (2) 加减

 

不可变对象需要解释?str int 这种,函数中的修改对外部无影响。

 

重点在可变对象如list这种.

def f(l):
  l.extend([ilovecxk, 123])
 
a = [phpno1]

f(a)
print(a) # [‘phpon1‘, ‘ilovecxk‘, 123]

 

这很简单,相信大家都懂,但下面才是关键


def f(l):
 l = l + [4] 

a
= [phpno1]
f(a)
print(a) # [‘phpno1‘]

为啥不是 [‘phpno1‘, 4] ?

 

鄙人才疏学浅,说不清楚,可能叙述有误,多见谅。

因为执行加法的时候创建了一个新的列表,使 l 指向了新的列表,改变了 l 的值

 

那为什么append,  extend可以改变 l 的值呢?

因为它是在原列表的基础上追加(内存空间连续?), l 还是指向的原来的列表。其实这里就有点像C++的指针了。

 

变量无类型, 对象有类型。l 是一个变量, 它指向了list。

但是它也可以指向函数,类, 其他的list。

所以终归来说还是地址和内存。。。。。。

 

实际上def f(l) 传进来的是一个地址, 并不在乎你的类型。

如果函数修改了这个内存地址内的值(eg extend,append...),那么是会影响外部的

l = [1,3,cxk]
print(id(l))    # 2875527776960
l.append(666)
print(id(l))    # 2875527776960

 

如果函数修改的不是这个内存地址内的值, 那么不会影响外部,而是创建了新的局部变量。 eg: l = l + [4], 

l = [1,3,cxk]
print(id(l))    # 1759618321856
l = l + [666]
print(id(l))    # 1759618322176

 

以上是关于Python3参数传递-忒恶心了吧的主要内容,如果未能解决你的问题,请参考以下文章

一些恶心的代码片段

如何绕过将数据模型传递给片段参数以避免事务太大异常?

将接口从片段传递到kotlin中的活动

操作栏选项卡:使用多次实例化的单个片段时如何传递参数

python3爬虫POST传递参数问题

学习笔记:python3,代码片段(2017)