最近在写用python写一个project,由于半吊子python水平,着实踩了不少坑…
从这一篇开始,以后遇到坑就积累下来
python 传参机制
望指正。
python的传参机制与我之前学习的语言中传值、传引用都不一样,也可以说是将二者相结合
python传参的时候传的的是对象
- 对于不可变变量,比如int 、float 、tuple等,函数内部改变值并不会改变外部的值,所以可以放心传参进去,return回来:
def double (a) : a = a + a return a a = 1 b = double(a) >> a = 1 # a 的值不会改变 >> b = 2
- 对于可变变量,比如list等,就很麻烦,传的是引用,而不是list的复制,如果用id()在函数内外测试,会发现id是一样的,即他们都指向了同一个内存地址,改变就会都改变
但很多时候,我们希望的是直传一个复制进去,不想让函数的执行影响到外部的变量def double (a) : a[0] = a[0] + a[0] a = [1] double(a) >> a = [2] # a 的值改变
-
对于简单的不可变变量可以这样操作(浅复制)
a = [1]
b = a[:]
double(b)即先复制在传参进去
-
对于复合型可变变量需要深复制:
- deepcopy()是python提供的函数,可以实现深复制,即了list元素是list也可以一起复制。
如果只是浅复制,就会出现最外层被复制,里层的list仍然是引用类型,指向同一个的内存地址
但听说这个方法是比较消耗系统资源的,如果对运行速度空间要求高,应该谨慎使用 - 如果明确知道是几层复合,不嫌麻烦,可以自己写深复制,即for循环浅复制,一层层的复制出来
- deepcopy()是python提供的函数,可以实现深复制,即了list元素是list也可以一起复制。
-