请教python中的copy和deepcopy的问题

按理说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结果完全一致,为什么呢?

慕村225694
浏览 531回答 3
3回答

慕桂英3389331

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] ============================== =========== 另:变量和对象本身在内存中是分离的, 变量中有个叫做引用的部分用来指向相应的引用。 所以,你拷贝了一个不可变的对象的引用, 修改你得到的变量只会让该变量的引用指向一个新的对象, 别指望还能改变原来的变量的引用所指向对象的值。

鸿蒙传说

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)

隔江千里

上面得出错误的结论,是因为数组中使用的是int,而不是复杂类型?
打开App,查看更多内容
随时随地看视频慕课网APP