参考: https://www.cnblogs.com/sun-haiyu/p/7096918.html
"""不过注意函数传参既不是传值也不是传引用,正确的叫法是传对象或者说传对象的引用。 函数参数在传递的过程中将整个对象传入,对可变对象的修改在函数外部以及内部都可见,调用者和被调用者之间共享这个对象,而对于不可变对象,由于不能真正被修改,因此修改往往是通过生成一个新的对象然后赋值来实现的 """注意一个例子: a+=b 有时候并不一定是a=a+b
a1 = [1, 2, 3] a2 = a1 print(id(a1), id(a2)) # 实际上是a2指向了新的对象,id已经改变。 # 所以现在a2、a1并不是同一对象的两个引用了,a2变化a1不会改变 a2 = a2 + [4] # 这个等式中,右边的a2还是和a1的id一样的,一旦赋值成功,a2就指向新的对象 print(id(1), id(a2)) # 不等,a2的id变化了 print(a1) # [1, 2, 3]没有变
a1 = [1, 2, 3] a2 = a1 print(id(a1), id(a2)) a2 += [4] # 相当于调用了a2.extend([4]),原地改变并没有新的对象产生 print(id(1), id(a2)) # 相等,a2的id没有变化 print(a1)
不同的地方在于a2 += [4]
,这句相当于调用了a2.extend([4])
相当于原地改变,并没有新的对象产生!