python的深拷贝与浅拷贝

标签: Python

1.首先我们要区分“==”和“is”的区别

is 是⽐较两个引⽤是否指向了同⼀个对象(引⽤⽐较)
== 是比较两个对象是否相等

2.浅拷贝:通俗的理解是:拷⻉了引⽤,并没有拷⻉内容

a = [1,2,3]
b = a
print(id(a))
print(id(b))
a.append(4)
print(a)
print(b)

输出结果:
2351359320328
2351359320328
[1, 2, 3, 4]
[1, 2, 3, 4]

可以看出a,b的地址是一样的
如果a改变了,b也会跟着改变,原因在于a,b指向同一个地址
在这里插入图片描述

3.深拷贝(需要导入copy包)

import copy
a = [1,2,3]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
a.append(4)
print(a)
print(b)

输出结果:
2728933169288
2728933184136
[1, 2, 3, 4]
[1, 2, 3]

可以看出,深拷贝后ab地址不一样,可以理解为开辟了一个新的空间给b,并将a的内容复制到b的空间中,所以ab是独立的,即使a改变了,b也不会变
在这里插入图片描述
再举一个复杂的例子以便大家巩固

a = [1,2,3]
b = [4,5,6]
c = [a,b]
d = c   # 浅拷贝
e = copy.deepcopy(c)  # 深拷贝
print(id(c))
print(id(d))
print(id(e))
a.append(4)
print(a)
print(b)
print(c)
print(d)
print(e)

输出结果:
2043216650504        
2043216650504        # cd的地址相同
2043216777672        # ce的地址不同
[1, 2, 3, 4]
[4, 5, 6]
[[1, 2, 3, 4], [4, 5, 6]]
[[1, 2, 3, 4], [4, 5, 6]]  # d随之改变了
[[1, 2, 3], [4, 5, 6]]    # e没有随之改变
版权声明:本文为ycarry2017原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ycarry2017/article/details/103840692