深、浅copy

赋值

  • python中,因为赋值“=”是直接引用地址。当采用赋值创建新的可变数据类型时,一旦更改其中的一个变量的值,另外一个变量也会随之改。
a=[1,2,3]
b=a
b[1]=4
print(id(a),a)
print(id(b),b)

得:
2082164662856 [1, 4, 3]
2082164662856 [1, 4, 3]

浅copy

  • 在内存中开辟一块新的地址,然后将最外层的元素复制一份。
a=[1,2,3,[11,22,99]]
b=a.copy()
a[3]=55

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

得:
2175551234696 [1, 2, 3, 55]
2175583528008 [1, 2, 3, [11, 22, 99]]

#如果对小列表内的元素进行修改,另一个列表也会随之发生改变,如果内层元素的一个值进行变化,另一个也会发生变化
a=[1,2,3,[11,22,33]]
b=a.copy()
b[3].append(44)

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

得:
1551065768520 [1, 2, 3, [11, 22, 33, 44]]
1551065768520 [1, 2, 3, [11, 22, 33, 44]]

深copy

  • 在内存中开辟新的地址,只复制原拷贝对象的内容,地址完全独立。此时无论怎么修改其中一个的数值,对另外一个都没有任何的影响。
import copy
a=[1,2,3,[11,22,33]]
b=copy.deepcopy(a)
b[3].append('44')

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

得:
1531946195784 [1, 2, 3, [11, 22, 33]]
1531946196616 [1, 2, 3, [11, 22, 33, 44]]

总结

  • 为什么Python默认的拷贝方式是浅拷贝?

    • 时间角度:浅拷贝花费时间更少。

    • 空间角度:浅拷贝花费内存更少。

    • 效率角度:浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高。

posted @ 2021-06-03 10:40  刘家小仙女  阅读(37)  评论(0编辑  收藏  举报