python copy

实际使用中,可能需要的是将里面的内容给复制出来到一个新的地址空间,这里可以使用python的copy模块,copy模块分为两种拷贝,一种是浅拷贝,一种是深拷贝。假设处理一个list对象,浅拷贝调用函数copy.copy(),产生了一块新的内存来存放list中的每个元素引用,也就是说每个元素的跟原来list中元素地址是一样的。所以从下面例子中可看出当原list中要是包含list对象,分别在a和b对list元素做操作时,两边都受到了影响。此外,通过b=list(a)来对变量b赋值时,也跟浅拷贝的效果一样。

a = [1, 1000, [‘a’, ‘b’]]
b = copy.copy(a)
b
[1, 1000, [‘a’, ‘b’]]

hex(id(a))
‘0x7fe7e02e1368’

hex(id(b))
‘0x7fe7e02e1518’

hex(id(a[2]))
‘0x7fe7e02caea8’

hex(id(b[2]))
‘0x7fe7e02caea8’

a[2].append(‘a+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’]]

b
[1, 1000, [‘a’, ‘b’, ‘a+’]]

b[2].append(‘b+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]

b
[1, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]

a[0] = 2
a
[2, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]

b
[1, 1000, [‘a’, ‘b’, ‘a+’, ‘b+’]]

而深拷贝则调用copy.deepcopy(),它将原list中每个元素都复制了值到新的内存中去了,因此跟原来的元素地址不相同,那么再对a和b的元素做操作,就是互相不影响了。

a = [1, 1000, [‘a’, ‘b’]]
b = copy.deepcopy(a)
hex(id(a))
‘0x7fe7e02cae18’

hex(id(b))
‘0x7fe7e02e1368’

hex(id(a[2]))
‘0x7fe7e02e14d0’

hex(id(b[2]))
‘0x7fe7e02e1320’

a[2].append(‘a+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’]]

b
[1, 1000, [‘a’, ‘b’]]

b[2].append(‘b+’)
a
[1, 1000, [‘a’, ‘b’, ‘a+’]]

b
[1, 1000, [‘a’, ‘b’, ‘b+’]]

当把一个变量传入一个函数时,它对应的对象引用个数增加2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值