2010-10-19 77 views
2

我在Python中很新(並且作爲一個整體編程)。我很確定這個答案很明顯,但我真的不知道該怎麼做。Python - 函數有一個列表作爲參數。如何返回另一個列表而不更改第一個?

def do_play(value, slot, board): 
    temp=board 
    (i,j) = slot 
    temp[i][j] = value 
    return temp 

板是列表的列表。值是一個整數。槽是整數元組。

我想在這裏做的是

  • 飼料功能板
  • 抄板到所謂的氣溫
  • 新名單中臨時插入一個特定位置的新值
  • 返回溫度,離開電路板不變

當我運行這個是shell,原始列表(板)和新列表(溫度)改變。 = \

任何幫助,將不勝感激。

+0

這將有助於查看程序的其餘部分。 – 2010-10-19 02:48:35

+2

歡迎來到Python。快速提示:'(i,j)= slot'中'i,j'附近的括號不是必需的。 – 2010-10-19 02:51:15

+0

謝謝您的建議和歡迎。 – Roughmar 2010-10-20 13:56:41

回答

10

temp=board不會成爲新的董事會。它使temp變量引用與board的列表非常相似。所以改變temp[i][j]也改變了board[i][j]

進行復印,使用

import copy 
temp=copy.deepcopy(board) 

注意temp=board[:]使得temp是指一個新的列表(比board不同,但內容(即在列表中的列表)仍相同:

In [158]: board=[[1,2],[3,4]]  
In [159]: temp=board[:]  

修改temp修改board太:

In [161]: temp[1][0]=100  
In [162]: temp 
Out[162]: [[1, 2], [100, 4]]  
In [163]: board 
Out[163]: [[1, 2], [100, 4]] 

id顯示對象的內存地址。這表明tempboard是不同的列表:

In [172]: id(temp) 
Out[172]: 176446508 

In [173]: id(board) 
Out[173]: 178068780 # The ids don't match 

但是,這表明裏面temp第二個列表裏面board非常相同的列表:

In [174]: id(temp[1]) 
Out[174]: 178827948 

In [175]: id(board[1]) 
Out[175]: 178827948 # The ids are the same 

但是如果你使用copy.deepcopy,那麼列表中的列表也會被複制,如果修改temp將使board保持不變,則這就是您需要的內容:

In [164]: import copy  
In [165]: board=[[1,2],[3,4]]  
In [166]: temp=copy.deepcopy(board)  
In [167]: temp[1][0]=100  
In [168]: temp 
Out[168]: [[1, 2], [100, 4]]  
In [169]: board 
Out[169]: [[1, 2], [3, 4]] 
2

使用copy.deepcopy()複製對象。

+1

+1用於鏈接到標準庫文檔。 – Wogan 2010-10-19 03:09:02

5

您是否想複製board

temp = board[:] 

也許這可以複製結構。

temp = [ r[:] for r in board ] 
+2

這隻會複製頂層。看起來'board'是一個列表列表,它基於進一步下行的'temp'上執行的索引。 – 2010-10-19 02:55:09

0
temp=board 

這不會複製列表,它只是使一個更reference同一個對象。改爲使用temp = board[:]

2

這裏temp是參考board,一個淺拷貝。我通常喜歡導入複製模塊(import copy)並使用copy.deepcopy,這使temp與板分離。你會這樣說:

import copy 
temp = copy.deepcopy(board) 

否則,你可以做一個董事會(這也使深層複製)。我相信這應該起作用,但是我沒有在列表中嘗試過。你會這麼稱呼它:

temp = board[:] 
+0

'[:]'操作員不會進行深層複製。你的第一個選擇是正確的。 – aaronasterling 2010-10-19 02:56:42

+0

謝謝!我非常喜歡用切片進行猜測。 – jlv 2010-10-19 03:00:23

相關問題