1. 浅拷贝
浅拷贝只复制父对象,其内部的子对象不复制。可通过copy.copy实现。
2. 深拷贝
深拷贝不仅复制父对象,还复制子对象,相当于重新生成了一个一模一样的对象。
3. 区别
import copy
a = [1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)
print("a address: ", id(a))
print("b address: ", id(b))
print("c address: ", id(c))
print("d address: ", id(d))
print("e address: ", id(e))
结果:
我们可以看到b的地址和a一样,这是因为b仅仅是a的引用的原因
c,d,e分别对应浅拷贝,深拷贝,浅拷贝
再看另一个例子:
import copy
a = [1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)
a.append(4)
print("a: ", a)
print("b: ", b)
print("c: ", c)
print("d: ", d)
print("e: ", e)
结果:
在这里我们可以看到,a变,b跟着变了,而深拷贝和浅拷贝都没有发生变化,这是因为数字是不可变类型。
常见的不可变类型有:
- 数字
- 字符串
- 元组
第三个例子:
import copy
a = [[1, 2], 1, 2, 3]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = list(a)
a[0].append(3)
print("a: ", a)
print("b: ", b)
print("c: ", c)
print("d: ", d)
print("e: ", e)
结果:
这里我们可以看到仅深拷贝没有发生变化,这是因为深拷贝不仅拷贝了父对象即列表a,还拷贝了子对象即a中的[1, 2]。列表是可变对象,所以浅拷贝都随着a的变化而变化了。
可变类型:
- 列表
- 字典
顺便说一下可变与不可变类型:
可变类型不论值相不相同地址都不同。
不可变对象值相同则地址相同。
参考:
https://www.cnblogs.com/alan-babyblog/p/5177597.html
https://www.cnblogs.com/blackmatrix/p/5614086.html