Python深拷贝和浅拷贝
- 浅拷贝就是对于一个对象引用的拷贝,而深拷贝就是对对象资源(具体值)的拷贝
- 对于不可变对象(字符串、元组,整型)的修改,需要开辟新的空间,此时id发生改变,而对于可变对象(列表,字典等)的修改,不需要开辟新的空间
- 浅拷贝后的orilist和copylist中的元素都指向了相同的地址。修改不可变对象的时候,就需要开辟新的空间(地址变了),所以orilist和copylist中的字符串内容不一样。但是对于list,修改orilist中的list对象后,copylist中的list内容也随之发生了改变。(因为copylist和orlist的list是指向的同一个对象)
- 深拷贝无论是对于可变对象还是不可变对象,对于orilist的修改都不会影响到deepcopylist中的内容
对于一个可变对象(列表)的例子
注意到 python3 语言, 对象是一个盒子,有具体的地址,而变量名相当于是 "标签",可以贴在盒子上。
我们需要辨析:nums1 = A 和 nums1[:] = A 的不同之处:
- nums1 = A # 更改 nums1 这一变量名所指向的对象。让 nums1 变量指向 A 所指向的对象
- nums1[:] = A # 对 nums1 指向的对象赋值。把 A 变量指向的对象的值逐个 copy 到 nums1 指向的对象中并覆盖 nums1 指向的对象的原来值。
# 对象在内存中的地址与id一一对应,可以使用 id() 查看并判断是否是同一个对象
nums1 = [1,2,4,0,0]
print(id(nums1)) # 140125129895880
A = [1,2,3,4,5]
print(id(A)) # 140125129856640
nums1[:] = A
print(id(nums1))) # 140125129895880, 仍是原 list 对象, 只不过这一 list 对象的值发生了改变
# 若不执行 nums1[:] = A, 而执行
nums1 = A
print(id(nums1)) # 140125129856640, 不再是之前的那个 list 对象