python - 深拷贝与浅拷贝

浅拷贝:只拷贝地址,不拷贝内容
深拷贝:只拷贝内容, 不拷贝地址

以下直接举例说明

粟子 一

a = [11, 22, 33]
b = a # 浅拷贝

print(id(a))
print(id(b))

打印结果

4491154184
4491154184

直接将一个变量赋值给另一个变量为浅拷贝,a与b都指向同一块内存地址

python - 深拷贝与浅拷贝_第1张图片

粟子 二

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为深拷贝

python - 深拷贝与浅拷贝_第2张图片

粟子 三

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  ca值:[11, 22, 33, 123]
d的地址:4407993800  da值:[11, 22, 33]

从打印的结果可以看出,d与c的地址不一样,d中的a与c中的a不一样,说明了copy.deepcopy()的深拷贝是递归拷贝,将变量中所引用的变量也进行内容上的拷贝

python - 深拷贝与浅拷贝_第3张图片

粟子 四

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  ca值:[11, 22, 33, 123]
d的地址:4464010696  da值:[11, 22, 33, 123]

d与c的地址不一样,但是d中的a与c中的a一样,说明了copy.copy()的只进行第一层的深拷贝

python - 深拷贝与浅拷贝_第4张图片

粟子 五

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()拷贝一个不可变类型的变量时为浅拷贝,如果拷贝变量为可变类型时则只深拷贝第一层

python - 深拷贝与浅拷贝_第5张图片

你可能感兴趣的:(python)