python copy模块无效

例子1:

import copy
a = [1, 2, 3]
a1 = copy.copy(a)
a2 = copy.deepcopy(a)
a[0] = 22
print a
print a1
print a2

out:
[22, 2, 3]
[1, 2, 3]
[1, 2, 3]

例子2:

import copy


class A(object):
    def __init__(self):
        self.array =[1, 2, 3]

a = A()
b = copy.copy(a)
c = copy.deepcopy(a)
a.array[0] = 2

print "a", a.array
print "b", b.array
print "c", c.array

out:
a [2, 2, 3]
b [2, 2, 3]
c [1, 2, 3]

从上面的结果可以看到例子1的浅拷贝是没有效果的。
copy这个模块我看很多demo都是例子1这样的,但是它们的结果是对的,我试了下不对。python
版本是2.7
请问我的问题出在哪?

阅读 6.1k
4 个回答

浅拷贝只拷贝对象的引用, [1, 2, 3]是一个列表对象, self.array 引用的这个列表对象,浅拷贝只会拷贝这个引用。

浅拷贝:新对象与原对象共享内存中的子对象
深拷贝:创建一个新的组合对象,同时递归地拷贝所有子对象,新的组合对象与原对象没有任何关联

import copy
a = [1, [1, 2]]
a1 = copy.copy(a)
a2 = copy.deepcopy(a)

print id(a), id(a1), id(a2)

print [id(_) for _ in a]
print [id(_) for _ in a1]
print [id(_) for _ in a2]


#看看内存地址
4483068056 4483069424 4483069496
[140294314049624, 4483068128]#浅copy
[140294314049624, 4483068128]#浅copy
[140294314049624, 4483069352]#深copy

你的例子1浅拷贝没有问题,得到的是预期结果。是你对浅拷贝的理解有点偏差。

为什么会出现1,2两种情况,引用下别人的图解

解析

1、b = a: 赋值引用,a 和 b 都指向同一个对象。

clipboard.png

2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

clipboard.png

3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

图片描述

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题