python赋值浅拷贝和深拷贝的区别_浅拷贝、深拷贝和普通赋值操作有什么区别?...

对于不可变对象,创建副本没有多大意义,因为它们不会改变。对于可变对象^{},^{}和^{}的行为不同。让我们用例子来讨论它们。

赋值操作只是将源的引用赋值给目标,例如:>>> i = [1,2,3]

>>> j=i

>>> hex(id(i)), hex(id(j))

>>> ('0x10296f908', '0x10296f908') #Both addresses are identical

现在i和j在技术上指的是同一个列表。i和j都有相同的内存地址。任何更新

它们中的一个会反射到另一个。e、 克:>>> i.append(4)

>>> j

>>> [1,2,3,4] #Destination is updated

>>> j.append(5)

>>> i

>>> [1,2,3,4,5] #Source is updated

另一方面,copy和deepcopy创建变量的新副本。所以现在对原始变量的更改将不会反映出来

复制变量,反之亦然。但是copy(shallow copy),不要创建嵌套对象的副本,而只是

复制嵌套对象的引用。Deepcopy递归地复制所有嵌套对象。

演示copy和deepcopy行为的一些示例:

使用copy:的平面列表示例>>> import copy

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

>>> j = copy.copy(i)

>>> hex(id(i)), hex(id(j))

>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are different

>>> i.append(4)

>>> j

>>> [1,2,3] #Updation of original list didn't affected copied variable

使用copy:的嵌套列表示例>>> import copy

>>> i = [1,2,3,[4,5]]

>>> j = copy.copy(i)

>>> hex(id(i)), hex(id(j))

>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are still different

>>> hex(id(i[3])), hex(id(j[3]))

>>> ('0x10296f908', '0x10296f908') #Nested lists have same address

>>> i[3].append(6)

>>> j

>>> [1,2,3,[4,5,6]] #Updation of original nested list updated the copy as well

使用deepcopy:的平面列表示例>>> import copy

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

>>> j = copy.deepcopy(i)

>>> hex(id(i)), hex(id(j))

>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are different

>>> i.append(4)

>>> j

>>> [1,2,3] #Updation of original list didn't affected copied variable

使用deepcopy:的嵌套列表示例>>> import copy

>>> i = [1,2,3,[4,5]]

>>> j = copy.deepcopy(i)

>>> hex(id(i)), hex(id(j))

>>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are still different

>>> hex(id(i[3])), hex(id(j[3]))

>>> ('0x10296f908', '0x102b9b7c8') #Nested lists have different addresses

>>> i[3].append(6)

>>> j

>>> [1,2,3,[4,5]] #Updation of original nested list didn't affected the copied variable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值