2014-04-29 84 views
0

下面的代碼:變量「rect_pos_single」的添加值以字典在Python

rect_pos = {} 

rect_pos_single = [[0,0], [50, 0], [50, 100], [0, 100]] 

i = 0 

while (i<3): 

    for j in range(4): 

     rect_pos_single[j][0] += 50 

    print rect_pos_single 

    rect_pos[i] = rect_pos_single 

    i += 1 

print rect_pos 

的代碼打印後續迭代。接下來,我將它們添加到字典「rect_pos」。密鑰更改,但值始終相同 - 最後一次迭代。我不懂爲什麼?

+0

您是否嘗試過從字典中提取元素,執行添加,然後將其重新添加到字典中? 您的預期產出是什麼?你當前的輸出是什麼? – aplassard

回答

1

此行

rect_pos_single[j][0] += 50 

修改列表就地;即rect_pos_single總是指向相同的列表對象,但是您更改了該列表的內容。

此行

rect_pos[i] = rect_pos_single 

分配給由rect_pos_single參考rect_pos[i]列表的引用。 rect_pos的每個元素引用相同的列表。

最簡單的變化是列表的副本分配到字典中

rect_pos[i] = copy.deepcopy(rect_pos_single) # Make sure you import the copy module 

需要一個深層副本,因爲rect_pos_single是列表的列表,並做了淺拷貝與rect_pos_single只會創建一個新列表,其中引用了與rect_pos_single[j][0] += 50實際修改的相同列表。