为了账号安全,请及时绑定邮箱和手机立即绑定

请教python中的copy和deepcopy的问题

请教python中的copy和deepcopy的问题

慕村225694 2018-07-16 15:13:08
按理说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] 

============================== =========== 
另:变量和对象本身在内存中是分离的, 变量中有个叫做引用的部分用来指向相应的引用。 

所以,你拷贝了一个不可变的对象的引用, 修改你得到的变量只会让该变量的引用指向一个新的对象, 别指望还能改变原来的变量的引用所指向对象的值。


查看完整回答
反对 回复 2018-07-17
?
鸿蒙传说

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)


查看完整回答
反对 回复 2018-07-17
?
隔江千里

TA贡献1906条经验 获得超10个赞

上面得出错误的结论,是因为数组中使用的是int,而不是复杂类型?

查看完整回答
反对 回复 2018-07-17
  • 3 回答
  • 0 关注
  • 529 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信