python deepcopy浪费时间_Python——入门级(copy & deepcopy 浅复制 & 深复制)

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

id

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

>>> 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和‘==’的不同

深拷贝

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

#copy.copy()

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

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

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

False

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

True

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

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

[1, 2, [3333, 4]]

#copy.deepcopy()

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

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

>>> e

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

>>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值