如果我要運行這段代碼:Python的傳遞列表作爲參數
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
爲什麼它會返回[「是」]雖然我並沒有直接改變變量「示例」,而我怎麼可能修改代碼,以便「示例」不受函數影響?
如果我要運行這段代碼:Python的傳遞列表作爲參數
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
爲什麼它會返回[「是」]雖然我並沒有直接改變變量「示例」,而我怎麼可能修改代碼,以便「示例」不受函數影響?
一切都是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']
[]
你也可以使用'myList [:]'創建任何列表的副本,但請記住這是一個「淺拷貝」,這意味着新列表的第n個元素引用與舊元素的第n個元素相同的對象一。 – MatrixFrog 2010-02-23 22:03:05
好點,MatrixFrog – 2010-02-23 22:05:04
「爲什麼它會返回['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
被該函數更新,請不要將它傳遞給該函數。
如果您希望函數創建一個新列表,然後編寫函數以創建一個新列表。
修改代碼的最簡單方法是將[:]添加到函數調用中。
def function(y):
y.append('yes')
return y
example = list()
function(example[:])
print(example)
它是因爲您在打印列表之前調用了函數。如果您打印該列表,然後調用該函數,然後再次打印該列表,則會得到一個空列表,然後是附加版本。它按您的代碼順序排列。
http://effbot.org/zone/default-values.htm描述了一個不同但有點相關的問題。閱讀可能會幫助您瞭解正在發生的事情。 – MatrixFrog 2010-02-23 22:04:30