Python值传递和引用传递区别,哪些类型值传递,哪些是引用传递?
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
>>> a1 = 520 >>> a2 = a1 >>> print a1 520 >>> print a2 520 >>> a2 = a1 + 1 >>> print a2 521 >>> print a1 520 >>>
引用传递:也称地址传递,在方法调用时,实际上是把参数的引用(传的是地址,而不是参数的值)传递给方法中对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
>>> a1 = [1,2] >>> a2 = a1 >>> a2.append(3) >>> print a1 [1, 2, 3] >>> print a2 [1, 2, 3] >>>
在Python中,数字、字符或者元组等不可变对象类型都属于值传递,而字典dict或者列表list等可变对象类型属于引用传递。
如果要想修改新赋值后原对象不变,则需要用到python的copy模块,即对象拷贝。对象拷贝又包含浅拷贝和深拷贝。下面用例子来说明
import copy l1 = [[1, 2], 3] l2 = copy.copy(l1) l3 = copy.deepcopy(l1) l2.append(4) l2[0].append(5) l3[0].append(6)
最后的结果:
l1 = [[1, 2, 5], 3] l2 = [[1, 2, 5], 3, 4] l3 = [[1, 2, 6], 3]
从上例可以看出,copy.copy属于浅拷贝,拷贝的是第一层list,而copy.deepcopy属于深拷贝,对list所有子元素都进行深拷贝。



