Python中参数的传递都是“引用传递”,具体分两类:
对“可变对象”进行“写操作”,直接作用于原对象本身。对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填充这块空间。(起到其他语言的“值传递”效果,但不是“值传递”) 可变对象:字典、列表、集合、自定义对象 不可变对象:数字、元组、字符串、function等传递参数是不可变对象(例如:int、float、字符串、元组、布尔值),实际传递的还是对 象的引用。在”赋值操作”时,由于不可变对象无法修改,系统会新创建一个对象。
a = 100 def f(n): print("n:",id(n)) #传递进来的是 a 对象的地址 n = n + 200 # 由于 a 是不可变对象,因此创建新的对象 n print("n:", id(n)) # n 已经变成了新的对象 print(n) f(a) print("a:",id(a)) print(a)显然,通过 id 值我们可以看到 n 和 a 一开始是同一个对象。给 n 赋值后,n 是新的对象。
为了更深入的了解参数传递的底层原理,我们需要讲解一下“浅拷贝和深拷贝”。我们可以 使用内置函数:copy(浅拷贝)、deepcopy(深拷贝)。
浅拷贝:不拷贝子对象的内容,只是拷贝子对象的引用。深拷贝:会连子对象的内存也全部拷贝一份,对子对象的修改不会影响源对象。 import copy def testCopy(): '''测试浅拷贝''' a = [10, 20, [5, 6]] b = copy.copy(a) print("a", a) print("b", b) b.append(30) b[2].append(7) print("浅拷贝......") print("a", a) print("b", b) def testDeepCopy(): '''测试深拷贝''' a = [10, 20, [5, 6]] b = copy.deepcopy(a) print("a", a) print("b", b) b.append(30) b[2].append(7) print("深拷贝......") print("a", a) print("b", b) testCopy() print("*************") testDeepCopy()待续