python中深拷贝和浅拷贝的小总结

关于python中浅拷贝和深拷贝的自我总结

1.引用

a = ["value1", "value2"]
b = a
id(a)
id(b)
这里内存分配了一块地址为这个列表,然后a指向这块地址,第二行代码意思是
让b也指向创建的列表,此时,a和b指向同一块内存空间,所以id(a)=id(b)。

2.浅拷贝

import copy
a = [1, 2]
b = [a, 3, 4]
c = copy.copy(b)
print(id(a))
print(id(b))
print(id(c))
print(id(b[0]))
print(id(c[0]))
a.append(5)
print(b)
print(c)
# 输出结果
# id(a)
# 1362057885768
# id(b)
# 1362057885640
# id(c)
# 1362057823560
# id(b[0])
# 1362057885768
# id(c[0])
# 1362057885768
# print(b)
# [[1, 2, 5], 3, 4]
# print(c)
# [[1, 2, 5], 3, 4]
从结果可以看出,b和c的id地址不一样,c重新指向了一块空间,但是比较b[0]和
c[0]的时候,却发现指向同一块内存地址,再次通过调用a.append方法,向a中追
加值,发现输出来的b,c也随着变化了,这就是浅拷贝,拷贝的不够彻底。

3.深拷贝

import copy
a = [1, 2]
b = [a, 3, 4]
c = copy.deepcopy(b)
print(id(a))
print(id(b))
print(id(c))
print(id(b[0]))
print(id(c[0]))
a.append(5)
print(b)
print(c)
# 输出结果
# id(a)
# 1317602461064
# id(b)
# 1317602515208
# id(c)
# 1317602515272
# id(b[0])
# 1317602461064
# id(c[0])
# 1317602514824
# print(b)
# [[1, 2, 5], 3, 4]
# print(c)
# [[1, 2], 3, 4]
通过观察代码发现,id(a)和id(b[0])指向同一块内存地址,但是id(c[0])却和
它们不一样了,c[0]重新指向了新的一块地址,所以无论a怎么变化,都不会影响到
c,也可以这么说,c与a,b没有了任何关系。于是深拷贝就是比浅拷贝更加彻底。

4.注意

对于像元组这样的不可变类型进行深浅拷贝的时候需注意,废话不多说,上代码:
import copy
a = (1, 2)
b = copy.copy(a)
c = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(c))
# 输出结果
# id(a)
# 2579250860296
# id(b)
# 2579250860296
# id(c)
# 2579250860296
可见结果中三个地址一样,所以说明对于元组这种不可变类型,它不会重新再在内存
中创建一个元组对象,深浅拷贝就相当于让b,c指向a所指向的内存地址。
需要我们注意的是,此时,元组中的元素是不可变类型。那要是把一些可变类型当作
元组的元素呢?代码如下:
import copy
a = [1, 2]
b = [3, 4]
c = (a, b)
d = copy.copy(c)
e = copy.deepcopy(c)
print(id(a))
print(id(b))
print(id(c))
print(id(d))
print(id(e))
a.append(5)
print(a)
print(c)
print(d)
print(e)
# 输出结果
# print(id(a))
# 1522131609608
# print(id(b))
# 1522131609480
# print(id(c))
# 1522131610952
# print(id(d))
# 1522131610952
# print(id(e))
# 1522131631560
# a
# [1, 2, 5]
# c
# ([1, 2, 5], [3, 4])
# d
# ([1, 2, 5], [3, 4])
# e
# ([1, 2], [3, 4])
结果可以看到,当元组的元素变为不可变类型之后,浅拷贝相当于引用,让c和d指
向同一块内存地址,深拷贝的话,就是彻底拷贝了。e和前面的变量就没有关联了。

作为一名以后的python从业者,这是我第一个博客,以后每天我也会坚持写一个博客,加油。

猜你喜欢

转载自blog.csdn.net/weixin_45332230/article/details/106961580