浅拷贝:只拷贝地址,不拷贝内容
深拷贝:只拷贝内容, 不拷贝地址
以下直接举例说明
a = [11, 22, 33]
b = a # 浅拷贝
print(id(a))
print(id(b))
打印结果
4491154184
4491154184
直接将一个变量赋值给另一个变量为浅拷贝,a与b都指向同一块内存地址
import copy
a = [11, 22, 33]
b = copy.deepcopy(a)
print("a的地址:%s a = %s"%(id(a),a))
print("b的地址:%s b = %s"%(id(b),b))
打印结果
a的地址:4352090888 a = [11, 22, 33]
b的地址:4352091016 b = [11, 22, 33]
copy. deepcopy为深拷贝
import copy
a = [11, 22, 33]
b = [44, 55, 66]
c = [a, b]
d = copy.deepcopy(c)
a.append(123)
print("c的地址:%s c的a值:%s"%(id(c), c[0]))
print("d的地址:%s d的a值:%s"%(id(d), d[0]))
打印结果
c的地址:4407994888 c的a值:[11, 22, 33, 123]
d的地址:4407993800 d的a值:[11, 22, 33]
从打印的结果可以看出,d与c的地址不一样,d中的a与c中的a不一样,说明了copy.deepcopy()的深拷贝是递归拷贝,将变量中所引用的变量也进行内容上的拷贝
import copy
a = [11, 22, 33]
b = [44, 55, 66]
c = [a, b]
d = copy.copy(c)
a.append(123)
print("c的地址:%s c的a值:%s"%(id(c), c[0]))
print("d的地址:%s d的a值:%s"%(id(d), d[0]))
打印结果
c的地址:4464011784 c的a值:[11, 22, 33, 123]
d的地址:4464010696 d的a值:[11, 22, 33, 123]
d与c的地址不一样,但是d中的a与c中的a一样,说明了copy.copy()的只进行第一层的深拷贝
import copy
a = [11, 22, 33]
b = [44, 55, 66]
c = (a, b)
d = copy.copy(c)
print("c的地址:%s"%(id(c)))
print("d的地址:%s"%(id(d)))
a.append(123)
print("c中的a: %s"%(c[0]))
print("d中的a: %s"%(d[0]))
打印结果
c的地址:4546477576
d的地址:4546477576
c中的a: [11, 22, 33, 123]
d中的a: [11, 22, 33, 123]
使用copy.copy()拷贝一个不可变类型的变量时为浅拷贝,如果拷贝变量为可变类型时则只深拷贝第一层