深浅拷贝 python

257 阅读1分钟
浅拷贝:是对于一个对象的顶层拷贝,通俗理解:拷贝了引用,并没有拷贝内容
  • 代码说明

import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
d = c[:]
f = copy.copy(c)
print(id(c))
print(id(d))
运行结果:

2473847637832
2473847637896
给列表c追加元素

c.append(99)
print(c)
print(d)
print(f)
运行结果:

[[11, 22], [33, 44], 99]
[[11, 22], [33, 44]]
[[11, 22], [33, 44]]
再给a追加元素:

a.append(66)
print(c)
print(d)
print(f)
运行结果:

[[11, 22, 66], [33, 44], 99]
[[11, 22, 66], [33, 44]]
[[11, 22, 66], [33, 44]]
解释说明:d、f列表和c列表都是引用了a,b列表,所以当a或者b元素改变时,d、f和c列表都会改变;也说明了[:] 是浅拷贝。
深拷贝:是对于一个对象所有层次的拷贝(递归)
  • 代码说明

import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
d = copy.deepcopy(c)
给a, c 同时追加元素

a.append(66)
c.append(99)
print(a)
print(c)
print(d)
运行结果:

[11, 22, 66]
[[11, 22, 66], [33, 44], 99]
[[11, 22], [33, 44]]
解释说明:当a和c列表改变时,d列表并没有改变,这个就是深拷贝,即是递归对每一个元素的拷贝。
注意:对不可变类型的深浅拷贝都是对其的引用,值和id都不会改变