Python --copy深浅拷贝说明

#列表
lst1 = ['A', 'B', 'C']
lst2 = lst1
lst1.append('D')
print(lst1, lst2)
#字典
dic1 = {'A': '1', 'B': '2'}
dic2 = dic1
dic1['C'] = '3'
print(dic1, dic2)
#set集合
s1 = {'A', 'B', 'C'}
s2 = s1
s1.add('D')
print(s1, s2)

'''
结果:
['A', 'B', 'C', 'D'] ['A', 'B', 'C', 'D']
{'A': '1', 'C': '3', 'B': '2'} {'A': '1', 'C': '3', 'B': '2'}
{'A', 'C', 'B', 'D'} {'A', 'C', 'B', 'D'}
'''

对于list、set、dict来说,直接赋值就是把内存地址交给变量,并不是复制一份内容,所以lst1的内存指向和lst2一样的,不管lst1还是lst2新增或者删除元素,都会进行改变

  • 浅拷贝copy 1:
import copy
lst1 = ['A', 'B', 'C']
lst2 = lst1.copy()
lst1.append('D')
print(lst1, lst2)
print(id(lst1), id(lst2))

结果:
['A', 'B', 'C', 'D'] ['A', 'B', 'C']
35980808 35559880
  • 浅拷贝copy 2:只拷贝第一层,第二层的内容不会被拷贝,所以称为浅拷贝
import copy
lst1 = ['A', 'B', 'C', ['D', 'E']]
lst2 = lst1.copy()
lst1[3].append('F')
print(lst1, lst2)
print(id(lst1[3]),id(lst2[3]))

结果:
['A', 'B', 'C', ['D', 'E', 'F']] ['A', 'B', 'C', ['D', 'E', 'F']]
35587592 35587592

我们发现,浅拷贝copy 1使用copy()方法,两个list的内容和内存地址都不一样了,实现了内存的拷贝,但浅拷贝copy 2也使用的是copy()方法,但只拷贝了第一层,第二层 lst2的内存地址还是和lst1在同一块,那怎么解决这块问题了,我们看下深拷贝

  • 深拷贝 deepcopy()
import copy
lst1 = ['A', 'B', 'C', ['D', 'E']]
lst2 = copy.deepcopy(lst1)  #copy.deepcopy(变量)
lst1[3].append('F')
print(lst1, lst2)
print(id(lst1[3]),id(lst2[3]))

结果:
['A', 'B', 'C', ['D', 'E', 'F']] ['A', 'B', 'C', ['D', 'E']]
35928840 35926216

现在看,内层的内存地址都不一样了,深度拷贝就是把元素内部的元素完全进行拷贝复制,这样就不会出现浅拷贝那种情况
copy.deepcopy(变量),不管有多少层都会完全进行拷贝复制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值