19.Python - copy & 浅复制 & 深复制

Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。


id

什么是id?一个对象的id值在Python解释器里就代表它在内存中的地址

copyPython中是一个模块,所以我们要import引入


>>> import copy

>>> a=[1,2,3]

>>> b=a

>>> id(a)

"""

4382960392

"""

>>> id(b)

"""

4382960392

"""


>>> id(a)==id(b)    #附值后,两者的id相同,为true

True

>>> b[0]=222222  #此时,改变b的第一个值,也会导致a值改变。

>>> print(a,b)

[222222, 2, 3] [222222, 2, 3] #a,b值同时改变




浅拷贝

当使用浅拷贝时,python只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。看代码:

>>> import copy

>>> a=[1,2,3]

>>> c=copy.copy(a)  #拷贝了a的外围对象本身,

>>> id(c)

"""

4383658568

"""

>>> print(id(a)==id(c))  #id 改变 false

"""

False

"""

>>> c[1]=22222   #此时,我去改变c的第二个值时,a不会被改变。

>>> print(a,c)

[1, 2, 3] [1, 22222, 3] #a值不变,c的第二个值变了,这就是copy和‘==’的不同


>>> a=[1,2,[3,4]]  #第三个值为列表[3,4],即内部元素

>>> d=copy.copy(a) #浅拷贝a中的[34]内部元素的引用,非内部元素对象的本身

>>> id(a)==id(d)

False

>>> id(a[2])==id(d[2])

True

>>> a[2][0]=3333  #改变a中内部原属列表中的第一个值

>>> d             #这时d中的列表元素也会被改变

[1, 2, [3333, 4]]





深拷贝

deepcopy对外围和内部元素都进行了拷贝对象本身,而不是对象的引用。

#copy.deepcopy()

>>> e=copy.deepcopy(a) #e为深拷贝了a

>>> a[2][0]=333 #改变a中内部元素列表第一个的值

>>> e

[1, 2, [3333, 4]] #因为时深拷贝,这时e中内部元素[]列表的值不会因为a中的值改变而改变

>>>


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值