[英]Cloned list seems to be functioning as an alias, even though explicitly declared as a a clone
我在使用以下腳本時遇到了一些麻煩。 它應制作以下列表的3份副本,以便可以獨立修改它們。 但是,它似乎正在創建同一列表的3個克隆,並且在修改一個時,您將全部修改。 這是函數:
def calculateProportions(strategies,proportions):
import itertools
combinations = []
columns = list(itertools.product(strategies,repeat=3))
for i in range(0,len(columns)):
columns[i] = list(columns[i])
for n in range(0,len(strategies)):
combinations.append(columns[:])
combinations[0][0][0] = "THIS SHOULD ONLY BE IN ONE PLACE"
print combinations
strategies = [[0,0],[0,50],[50,50]]
calculateProportions(strategies,[])
請注意,在運行此命令時,如何看到字符串“應該在一個位置” 3次(位置[0] [0] [0],[1] [0] [0]和[2] [0 ] [0],不是一次,這似乎是因為列表是一起別名而不是克隆,但是我明確地克隆了它。
我已經花了最后一個小時將頭撞到桌子上。 非常感謝您提出的解決方案!
克隆columns
時,您僅執行淺表復制 ,即克隆了列表,但沒有克隆其項目,因此在combinations
和columns
都使用相同的項目引用。
您可以使用copy.deepcopy()函數執行對象的深層復制:
def calculateProportions(strategies,proportions):
import copy
import itertools
combinations = []
columns = list(itertools.product(strategies, repeat=3))
for i in range(0, len(columns)):
columns[i] = list(columns[i])
for n in range(0, len(strategies)):
combinations.append(copy.deepcopy(columns))
或者,更簡單地說,是列表理解 :
def calculateProportions(strategies,proportions):
import itertools
combinations = []
columns = list(itertools.product(strategies, repeat=3))
for i in range(0, len(columns)):
columns[i] = list(columns[i])
for n in range(0, len(strategies)):
combinations.append([item[:] for item in columns])
>>> import copy
>>> help(copy)
在第一行中,您可以看到函數copy
和deepcopy
。 這些對應於淺層復制和深層復制。 有關詳細信息,請參閱http://en.wikipedia.org/wiki/Object_copy
獲取類似list[:]
的列表的副本不會創建列表中包含的元素的副本(即,它是平面副本,而不是深層副本)。 以下示例代碼對此進行了說明:
>>> n1 = [1, 2]
>>> n2 = [3, 4]
>>> l1 = [n1, n2]
>>> l2 = l1[:]
>>> l2[0] = "was n1" # change in l1 only
>>> l1
[[1, 2], [3, 4]]
>>> l2
['was n1', [3, 4]]
>>> l2[1][0] = "was 3 in n2" # affects both l1 and l2
>>> l1
[[1, 2], ['was 3 in n2', 4]]
>>> l2
['was n1', ['was 3 in n2', 4]]
如ulidtko所建議, 復制模塊可能對您有幫助。
當你寫
l = alist [:]
您正在執行淺表復制。 也就是說,列表不同,但是兩個列表指向相同的對象。 因此,如果您修改列表中的一個元素,則另一個列表中的元素也會被修改。
您需要進行深拷貝,即。 復制列表和列表中的所有對象。
import copy
copy.deepcopy()
我不會嘗試修復深層副本,而只是使用嵌套列表推導來創建所需的數據。 這也避免了最終數據的繁瑣的手動“累積”。
def calculateProportions(strategies, proportions):
import itertools
combinations = [
[list(x) for x in itertools.product(strategies, repeat = 3)]
for strategy in strategies
]
combinations[0][0][0] = "THIS SHOULD ONLY BE IN ONE PLACE"
print combinations
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.