python里的copy和deepcopy

之前一直没注意这个问题,后来有人问起就验证了下。

首先复制数值

import copy
a=1
b=copy.copy(a)
c=copy.deepcopy(a)
a += 1
print a
print b
print c
>>> 
2
1
1
改变a的值后,b c 的值不受影响

接着复制字符串

import copy
a="abc"
b=copy.copy(a)
c=copy.deepcopy(a)
a += "d"
print a
print b
print c

>>> 
abcd
abc
abc

改变a的值后,b c 的值不受影响

接着复制序列

import copy
a=[1,2,3]
b=copy.copy(a)
c=copy.deepcopy(a)
a.append(4)
print 'a=%s' % a
print 'b=%s' % b
print 'c=%s' % c
>>> 
a=[1, 2, 3, 4]
b=[1, 2, 3]
c=[1, 2, 3]

改变a的值以后,b c的值还是不受影响。

这么看来copy和deepcopy貌似没什么区别,下面复制一个复杂的序列试试

import copy
a=[1,2,3,[4,5]]
b=copy.copy(a)
c=copy.deepcopy(a)
print 'a=%s' % a
print 'b=%s' % b
print 'c=%s' % c
a[3].append(6)
print 'change a\na=%s' % a
print 'b=%s' % b
print 'c=%s' % c
>>> 
a=[1, 2, 3, [4, 5]]
b=[1, 2, 3, [4, 5]]
c=[1, 2, 3, [4, 5]]
change a
a=[1, 2, 3, [4, 5, 6]]
b=[1, 2, 3, [4, 5, 6]]
c=[1, 2, 3, [4, 5]]

奇怪的事发生了,a序列中的子序列变化后,b的子序列也跟着改变,c的值没有变化。

分析下,原来copy.copy会复制主对象的值,对主对象内的对象,复制了引用,而copy.deepcopy复制了对象所有的值。所以不论原对象怎么变化,deepcopy的结果都没有改变

为了验证copy.copy复制的是子对象的引用,可以这样验证下

import copy
a=[1,2,3,[4,5]]
b=copy.copy(a)
print 'a=%s' % a
print 'b=%s' % b
b[3].append(6)
print 'change b\na=%s' % a
print 'b=%s' % b

>>>

a=[1, 2, 3, [4, 5]]
b=[1, 2, 3, [4, 5]]
change b
a=[1, 2, 3, [4, 5, 6]]
b=[1, 2, 3, [4, 5, 6]]

可以看到,改变b的子对象值,a的子对象值也改变了

综上,如果复制对象没有子对象,复制操作传递的是值,copy和deepcopy没啥区别。如果复制对象中有子对象,为了达到复制数值目的,还是使用deepcopy比较好




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值