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参数传递-忒恶心了吧的主要内容,如果未能解决你的问题,请参考以下文章