2010-02-23 94 views
22

如果我要運行這段代碼:Python的傳遞列表作爲參數

def function(y): 
    y.append('yes') 
    return y 

example = list() 
function(example) 
print(example) 

爲什麼它會返回[「是」]雖然我並沒有直接改變變量「示例」,而我怎麼可能修改代碼,以便「示例」不受函數影響?

+0

http://effbot.org/zone/default-values.htm描述了一個不同但有點相關的問題。閱讀可能會幫助您瞭解正在發生的事情。 – MatrixFrog 2010-02-23 22:04:30

回答

41

一切都是Python中的參考。如果你想避免這種行爲,你必須創建一個list()原件的新副本。如果列表中包含更多的參考,你需要使用deepcopy()

def modify(l): 
l.append('HI') 
return l 

def preserve(l): 
t = list(l) 
t.append('HI') 
return t 

example = list() 
modify(example) 
print(example) 

example = list() 
preserve(example) 
print(example) 

輸出

['HI'] 
[] 
+3

你也可以使用'myList [:]'創建任何列表的副本,但請記住這是一個「淺拷貝」,這意味着新列表的第n個元素引用與舊元素的第n個元素相同的對象一。 – MatrixFrog 2010-02-23 22:03:05

+0

好點,MatrixFrog – 2010-02-23 22:05:04

6

「爲什麼它會返回['yes']

因爲你修改的列表,example

「即使我不直接更改變量'示例'。」

但是,您提供了由變量example命名的對象。該功能使用對象的append方法修改對象。

正如SO上的其他地方所討論的,append不會產生任何新東西。它修改了一個對象。

參見Why does list.append evaluate to false?,Python append() vs. + operator on lists, why do these give different results?,Python lists append return value

以及如何修改代碼,以便「示例」不受函數影響?

你是什麼意思?如果您不希望example被該函數更新,請不要將它傳遞給該函數。

如果您希望函數創建一個新列表,然後編寫函數以創建一個新列表。

8

修改代碼的最簡單方法是將[:]添加到函數調用中。

def function(y): 
    y.append('yes') 
    return y 



example = list() 
function(example[:]) 
print(example) 
0

它是因爲您在打印列表之前調用了函數。如果您打印該列表,然後調用該函數,然後再次打印該列表,則會得到一個空列表,然後是附加版本。它按您的代碼順序排列。