欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python的深拷贝与浅拷贝

程序员文章站 2022-05-28 19:41:22
...

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指向同一个地址
python的深拷贝与浅拷贝

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也不会变
python的深拷贝与浅拷贝
再举一个复杂的例子以便大家巩固

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没有随之改变
相关标签: Python