2014-03-29 106 views
2

這裏是我的代碼由值蟒蛇複製集列表

store = [set() for i in xrange(0,5)] 
items = store[:] 
store[1].add(1) 

這裏3行之後它改變了items

print items 

output : set([]), set([1]), set([]), set([]), set([]) 

我試着用for循環進入的每一個元素每個集合在store中分別添加到items上,清除items中的每個集合並得到相同的結果

是它無論如何要通過值複製上面的集合而不是它的引用,我只需要複製非空集合列表的值並再次遍歷它,但是由於它通過引用被複制,我的程序無法正常工作。

回答

3

您可以使用deepycopy

from copy import deepcopy 
items = deepcopy(store) 

>>> a = [1,2,3] 
>>> b = deepcopy(a) 
>>> b[1] = 1 
>>> print b 
[1,1,3] 
>>> print a 
[1,2,3] 

一個深複製構造一個新的複合對象,然後遞歸地將 插入到原始對象中的副本中。 (來自深度拷貝文檔)

它創建了一組完全不同的內存空間,而不是淺拷貝,只是指向相同的內存空間。

+0

做深拷貝工作在列表中只是數字太或以'set'一個namedtuple和'有解釋和例子int'在屬性 –

+0

@Pratyush,它適用於任何 – sshashank124

+0

@PratyushDhanuka,更新答案。希望澄清它。 – sshashank124

2

您只創建store的淺表副本;引用的可變集不會被複制。

你必須每個設置得複製:

items = [set(s) for s in store] 

或使用copy.deepcopy() function

import copy 

items = deepcopy(store)