pythondeepcopy和浅拷贝和通过参考

一个关于python深层拷贝和浅拷贝的问题。

post在深拷贝和浅拷贝之间有什么区别?

不能帮助我。

为什么例如1的总和是6而不是10?

eg1:

kvps = { '1' : 1, '2' : 2 } theCopy = kvps.copy() # both point to the same mem location ? kvps['1'] = 5 sum = kvps['1'] + theCopy['1'] print sum 

输出总和是6

eg2:

 aList = [1,2] bList = [3,4] kvps = { '1' : aList, '2' : bList } theCopy = kvps.copy() # both point to the same mem location ? kvps['1'][0] = 5 sum = kvps['1'][0] + theCopy['1'][0] print sum 

输出总和是10

eg3:

 import copy aList = [1,2] bList = [3,4] kvps = { '1' : aList, '2' : bList } theCopy = copy.deepcopy(kvps) kvps['1'][0] = 5 sum = kvps['1'][0] + theCopy['1'][0] print sum 

输出总和是6。

另外,例如4

 kvps = { '1' : 1, '2' : 2 } theCopy = dict(kvps) # theCopy hold a reference to kvps ? kvps['1'] = 5 # should also change theCopy , right ? sum = kvps['1'] + theCopy['1'] print kvps print theCopy print sum 

它的总和是6,如果复制是对kvps的引用,那应该是10。

浅拷贝使顶层容器中的可变对象变得复制。 深层副本在数据结构中创建所有可变容器的新实例。

“eg 2”的结果是10,因为你在外面复制字典,但里面的两个列表仍然是旧的列表,列表可以在原地更改(它们是可变的)。

深度复制使运行aList.copy(),bList.copy()并替换您的字典中的值与他们的副本。


例如1解释说:

 kvps = {'1': 1, '2': 2} theCopy = kvps.copy() # the above is equivalent to: kvps = {'1': 1, '2': 2} theCopy = {'1': 1, '2': 2} 

当你把这个应用到例如2:

 kvps = {'1': aList, '2': bList} theCopy = {'1': aList, '2': bList} 

两个字典中的列表对象都是相同的对象,所以修改其中一个列表将反映在两个字典中。


做一个深层复制(例如3)的结果是:

 kvps = {'1': aList, '2': bList} theCopy = {'1': [1, 2], '2': [3, 4]} 

这意味着这两个字典的内容完全不同,修改一个不会修改另一个。


例如4通过dict()相当于一个浅拷贝。

[点拨
在这个例子中,你可以制作键的副本,但不能指向它们指向的对象。 改变一个关键点不会改变该键的副本。 这是因为密钥的副本存在于内存中的不同位置,并且只会指向相同的对象,直到重新分配为止。 一个副本的重新分配不会改变另一个,这就是为什么你得到6。

EG2
密钥被复制。 两个键都指向相同的对象。 这个赋值修改了两个键所指向的对象(尽管这两个键都在内存中的不同位置),这就是为什么在总和中都看到了这个变化。

EG3
一切都被复制。 每个键指向它自己的对象副本。 内存中现在有两个“aList”。 由KVPS指向的aList被改变,而由COPY指向的“aList”不被改变。

http://docs.python.org/library/copy.html