Python的深拷贝与浅拷贝,以及”=”的区别

本文详细解析了Python中深拷贝与浅拷贝的区别,尤其针对可变对象如列表和字典,展示了不同拷贝方式下对象引用的变化及如何避免因对象引用导致的数据同步修改问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.对于不可对象来说(整型,字符串,元组):

deepcopy与copy的作用一样,得到的两个变量的地址一样,并且和“=”的作用相同。

In [88]: a="a"

In [89]: b=a

In [90]: c=copy.copy(a)

In [91]: d=copy.deepcopy(a)

In [94]: id(a)
Out[94]: 2222052779824

In [95]: id(b)
Out[95]: 2222052779824

In [96]: id(c)
Out[96]: 2222052779824

In [97]: id(d)
Out[97]: 2222052779824

2.对于可变对象(列表,字典)来说:

  1. 浅拷贝(两种情况):

    1. 复制的对象中没有复杂的子对象,如[1,2,3],原来的值并不影响浅复制的值,浅复制的值也不影响原来的值,两个对象的地址不一样

      In [113]: a=[1]
      
      In [114]: b=copy.copy(a)
      
      In [115]: id(a)
      Out[115]: 2222126222152
      
      In [116]: id(b)
      Out[116]: 2222126488904

       

            2.  复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表), 改变原             来的值 中的复杂子对象的值 ,会影响浅复制的值

In [121]: id(a)
Out[121]: 2222126316616

In [122]: id(b)
Out[122]: 2222126020168

In [123]: a[2][1]=6

In [124]: b
Out[124]: [1, 2, [3, 6]]

       2.深拷贝,完全复制独立,包括内层列表和字典

In [131]: a=[1,2,[3,4]]

In [132]: b=copy.deepcopy(a)

In [133]: a[2][0]=6

In [134]: b
Out[134]: [1, 2, [3, 4]]

       3.“=”的作用,无论是[1,2],还是[1,2,[3,4]]形式,它的作用都是两个变量的地址一样,司改一个变量的值,另一个变量的值也会跟着变化:

In [135]: a=[1,2]

In [136]: b=a

In [137]: id(a)
Out[137]: 2222126044680

In [138]: id(b)
Out[138]: 2222126044680

In [139]: a[0]=2

In [140]: b
Out[140]: [2, 2]

In [141]: a=[1,2,[2,3]]

In [142]: b=a

In [143]: a[2][0]=6

In [144]: b
Out[144]: [1, 2, [6, 3]]

In [145]: id(b)
Out[145]: 2222125880200

In [146]: id(a)
Out[146]: 2222125880200

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值