2014-09-23 75 views
-2

我試圖運行一個循環,我一次又一次地使用同一個列表。但是每一次執行都會修改列表。那麼如何在每次運行中將列表分配給相同的變量。給循環中的變量分配一個列表

import random 

def fuse(a, row, col): 
    a[row][col] = -a[row][col] 
    return a 

final_list = [[2,4],[5,6],[3,2],[1,0]] 
for k in range(3): 
    A = final_list[:] 
    print A 
    print final_list 
    for i in range(len(A)-2): 
     row = random.randint(0,len(A)-1) 
     col = random.randint(1,len(A[row])-1) 
     A = fuse(A,row,col) 

上述代碼A在每次運行中都會被修改。但是當我將final_list複製到A並打印A和final_list時,它們是不同的。我不明白。我想完全複製A中的final_list。有什麼建議嗎?

+2

看起來像你的'保險絲'功能是錯誤的,如果它修改'A'。 – wRAR 2014-09-23 05:11:42

+0

我必須在每次運行中修改「A」。但每場比賽必須是獨立的。因此,對於新的運行我再次需要相同的列表 – Ankit 2014-09-23 05:13:28

+1

你是什麼意思「我不能爲每次運行分配final_list到A」?這是否意味着你在第三行發生錯誤?或者它沒有達到你的預期?或者說它按照你的預期做了,但是你不能在你真實的代碼中做到這一點? – abarnert 2014-09-23 05:14:00

回答

0

您發佈的代碼並未真正顯示您的問題。事實上,它實際上不能運行(不管fuse是什麼),因爲A[row]總是int,所以len(A[row])保證會提高TypeError

但是,這使得它很明顯的是,在你的真正代碼,final_list不是數字的列表,但號碼清單的2D列表清單。

而這意味着A = final_list[:]只是複製頂層列表。所以,你得到一個新的列表 - 但它是一個新的列表,引用與原始列表完全相同的行。所以,如果fuse突變了其中一行,那麼您仍然會改變原始的final_list

你需要複製final_list下降2的水平,而不僅僅是1,像這樣:

A = [row[:] for row in final_list] 

...或只是深複製:

A = copy.deepcopy(final_list) 

下面是一個例子,實際上運行,並演示你的問題:

import random 

def fuse(a, row, col): 
    a[row][col] = -a[row][col] 
    return a 

final_list = [[2,4],[5,6],[3,2],[1,0]] 
for k in range(3): 
    A = final_list[:] 
    print A 
    for i in range(len(A)-2): 
     row = random.randint(0,len(A)-1) 
     col = random.randint(1,len(A[row])-1) 
     A = fuse(A,row,col) 

並將A = final_list[:]更改爲A = copy.deepcopy(final_list)(並添加import當然)現在可以達到您想要的效果。

+0

非常感謝。這正是我想要的。這是我的第一個stackoverflow問題,所以不知道如何提供所有的細節。再次感謝你。 – Ankit 2014-09-23 05:37:33

+0

@Ankit:閱讀[MCVE](http://stackoverflow.com/help/mcve)鏈接。你的代碼必須真正地展示你的問題,而不僅僅是一些類似於代碼的東西,以便讓人猜測。即使你得到了答案,你仍然應該編輯你的問題 - 既爲了同樣的問題的其他人的利益,也希望有人會喜歡它,而不是downvoting它。 – abarnert 2014-09-23 05:39:14