前言
有个朋友昨天问了我这个问题, 刚好挺长时间没写博客了, 就顺便划划水
赋值引用
赋值引用其实就是最基本也是最常用的引用, 即:
a = [1, 2, 3] b = a a[0] = 2 print(b) # [2, 2, 3]
就相当于下面的过程
所以当b=a时, 其实就是将b指向a的内存地址, 当a改变的时候, b也会随之改变
浅拷贝
浅拷贝就是只复制一份最外层元素, 生成一个新的内存地址, 但是如果原元素里有子对象, 比如列表字典这种, 就还是会指向之前的内存地址
import copy a = [1, 2, [3, 4]] b = copy.copy(a) a.append(5) print(b) # [1, 2, [3, 4]] a[2].append(6) print(a) # [1, 2, [3, 4, 6], 5] print(b) # [1, 2, [3, 4, 6]]
列表的切片就是浅拷贝
深拷贝
深拷贝其实就没啥说的了, 就是完全复制前对象, 跟前对象没有任何的关系
import copy a = [1, 2, [3, 4]] b = copy.deepcopy(a) a.append(5) print(b) # [1, 2, [3, 4]] a[2].append(6) print(a) # [1, 2, [3, 4, 6], 5] print(b) # [1, 2, [3, 4]]
完全独立
补充
数字和字符串都是对源对象的引用, 即只是指向不同的内存地址