一、浅拷贝
1.源列表、拷贝列表
a = [1, 2]
c = a.copy()
print(a, id(a))
print(c, id(c))
结果:
[1, 2] 2902263288328
[1, 2] 2902263288840
源列表与拷贝列表是两个完全独立的列表
2.修改源列表
a = [1, 2]
c = a.copy()
a[1]='winnie'
print(a, id(a))
print(c, id(c))
结果:
[1, 'winnie'] 2973475885576
[1, 2] 2973475886088
修改源列表,拷贝的列表不会跟着变
3.修改拷贝的列表
a = [1, 2]
c = a.copy()
c[1]='allen'
print(a, id(a))
print(c, id(c))
结果:
[1, 2] 2627341013512
[1, 'allen'] 2627341014024
修改拷贝的列表,原列表也不会改变
不管修改源列表还是拷贝的列表,都不会影响另一个,两个是完全独立的列表
4.修改列表里子对象的元素
- 源列表、拷贝列表
b = [1, 2, 3, ['b1', 'b2']]
c = b.copy()
print(b, id(b))
print(c, id(c))
结果:
[1, 2, 3, ['b1', 'b2']] 1907107779592
[1, 2, 3, ['b1', 'b2']] 1907109047496
- 修改源列表里子对象的元素
b = [1, 2, 3, ['b1', 'b2']]
c = b.copy()
b[3].append('cccccc')
print(b, id(b))
print(c, id(c))
结果:
[1, 2, 3, ['b1', 'b2', 'cccccc']] 1758110307336
[1, 2, 3, ['b1', 'b2', 'cccccc']] 1758111575240
改变原列表里子对象的元素,拷贝的列表里的子对象会跟着改变
- 修改拷贝列表里子对象的元素
b = [1, 2, 3, ['b1', 'b2']]
c = b.copy()
c[3].append('fffffff')
print(b, id(b))
print(c, id(c))
结果:
[1, 2, 3, ['b1', 'b2', 'fffffff']] 2059630957576
[1, 2, 3, ['b1', 'b2', 'fffffff']] 2059632225480
改变拷贝列表里子对象的元素,原列表里的子对象会跟着改变
不管修改源列表里子对象的元素还是拷贝列表里子对象的元素,都会影响另一个,所以才有了深拷贝。
二、深拷贝
1.源列表、拷贝列表
import copy
a = [1, 2]
c = copy.deepcopy(a)
print(a, id(a))
print(c, id(c))
结果:
[1, 2] 1630247784008
[1, 2] 1630247784264
源列表与拷贝列表是两个完全独立的列表
2.修改源列表
import copy
a = [1, 2]
c = copy.deepcopy(a)
a[1]='winnie'
print(a, id(a))
print(c, id(c))
结果:
[1, 'winnie'] 1159787253384
[1, 2] 1159787261192
修改原列表,拷贝的列表不会跟着变
3.修改拷贝列表
import copy
a = [1, 2]
c = copy.deepcopy(a)
c[1]='allen'
print(a, id(a))
print(c, id(c))
结果:
[1, 2] 2637287394824
[1, 'allen'] 2637287402696
修改拷贝的列表,原列表也不会改变
4.修改列表里子对象的元素
- 源列表、拷贝列表
import copy
b = [1, 2, 3, ['b1', 'b2']]
c = copy.deepcopy(b)
print(b, id(b))
print(c, id(c))
结果:
[1, 2, 3, ['b1', 'b2']] 1892672154056
[1, 2, 3, ['b1', 'b2']] 1892672155592
- 修改源列表里子对象的元素
import copy
b = [1, 2, 3, ['b1', 'b2']]
c = copy.deepcopy(b)
b[3].append('cccccc')
print(b, id(b))
print(c, id(c))
结果:
[1, 2, 3, ['b1', 'b2', 'cccccc']] 1704713793416
[1, 2, 3, ['b1', 'b2']] 1704713793480
改变原列表里子对象里的元素,拷贝的列表里子对象不会改变
- 修改拷贝列表里子对象的元素
import copy
b = [1, 2, 3, ['b1', 'b2']]
c = copy.deepcopy(b)
c[3].append('fffffff')
print(b, id(b))
print(c, id(c))
结果:
[1, 2, 3, ['b1', 'b2']] 1751635472264
[1, 2, 3, ['b1', 'b2', 'fffffff']] 1751635472328
改变拷贝列表里子对象里的元素,原列表里子对象不会改变
总结:
- 浅拷贝,相当于对象的引用,会创建一个新的对象,源对象和拷贝对象的任何一方改变都不会影响另外一个对象
- 但是如果存在子对象是可变的,源对象和拷贝对象的任意一方的改变都会影响另外一个对象,
- 所以有了深copy,就是改变子对象,源对象和拷贝对象的任意一方的改变都不会影响另外一个对象