按理说copy是浅拷贝,只是复制了指针引用, 而深拷贝会重新创建一个新对象,然后复制对象数据内容。 但是下面的代码证明我上面的理解是错误的: import copy
a = [8,9]
b = copy.copy(a)
c= a[:]print "before\t",a,b,c
b[1] = 8print "changed\t",a,b,c上面将输出: before [8, 9] [8, 9] [8, 9]
changed [8, 9] [8, 8] [8, 9]也就是说修改b中的值,不会影响到a和c 如果把copy换成deepcopy结果完全一致,为什么呢?
3 回答

慕桂英3389331
TA贡献2036条经验 获得超8个赞
google group中找到了想要的答案
Python中有一类对象是不可以原地修改的:数字、字符串、元组
当你对它修改时,Python会创建出新的对象。
a = 3
b = a
b = 4
print b # Prints 4
----------------
另一类对象是可以原地修改的:列表、字典等等
L1 = [1,2]
L2 = L1
L2[1] = 3
print L1,L2 #Prints [1,3] [1, 3]
============================== ===========
另:变量和对象本身在内存中是分离的, 变量中有个叫做引用的部分用来指向相应的引用。
所以,你拷贝了一个不可变的对象的引用, 修改你得到的变量只会让该变量的引用指向一个新的对象, 别指望还能改变原来的变量的引用所指向对象的值。

鸿蒙传说
TA贡献1865条经验 获得超7个赞
lass Obj(object): def __init__(self,num): self.num=num def __str__(self): return str(self.num) __repr__=__str__def test(fun): a=[ Obj(10),Obj(11) ] b=fun(a) print 'a=%s,b=%s'%(a,b) a.reverse() a[0].num=100 print 'a=%s,b=%s'%(a,b) print '='test(lambda _:_) print 'copy.copy'test(copy.copy) print 'copy.deepcopy'test(copy.deepcopy)
- 3 回答
- 0 关注
- 556 浏览
添加回答
举报
0/150
提交
取消