2012-03-09 85 views
2

這裏是我的代碼:爲什麼這個python代碼不會替換已刪除的列表元素?

for each in range(0, number_of_trials): 
    temp_list = source_list 
    for i in range(10): 
    x = random.randrange(0, len(temp_list)) 
    board[i] = temp_list[x] 
    del temp_list[x] 

此代碼刪除從temp_list每個元素,正如所預期的。但是temp_list在每次初始for循環運行時都沒有被重置,並將其設置回source_list。因此,每次從temp_list中刪除都是永久的,持續for循環的每一次迭代。我怎樣才能避免這種情況,並每次temp_list「重置」回到其初始狀態?

回答

3

聲明temp_list = source_list不會創建新列表。它給一個現有的列表一個新的名字temp_list。不管你用什麼名字來訪問列表—通過一個名字進行的任何改變都可以通過另一個名字看到。

相反,你需要複製該列表,像這樣:

temp_list = source_list[:] 

這將創建一個具有相同內容source_list開始一個新的列表。現在,您可以更改新列表而不影響原始內容。

1

複製列表元素而不是列表引用。

temp_list = source_list[:] 
2
>>> a = [ 1 ] 
>>> b = a 
>>> del a[0] 
>>> print b 
[] 

基本上,當您使用 「=」,這兩個變量指向同一個對象。要製作副本,請使用copy模塊。

0

這是因爲:

temp_list = source_list # Doesn't copies the list, but adds the reference. 

所以,每次迭代你只刷新引用。

要複製列表,您可以使用技巧[:]。這將執行列表分片,不進行任何切片,並生成與切片列表完全相同的新列表。

因此,

for each in range(0, number_of_trials): 
    temp_list = source_list[:]    # Changed 
    for i in range(10): 
    x = random.randrange(0, len(temp_list)) 
    board[i] = temp_list[x] 
    del temp_list[x] 

這應該按預期工作。 :)

相關問題