2015-01-26 94 views
5

最近,我去了一個Python開發人員職位的求職面試。以下代碼是其中一個問題。我只需要寫輸出。有人可以向我解釋這個非常基本的Python代碼嗎?

def extendList(val,list=[]): 
    list.append(val) 
    return list 

list1 = extendList(10) 
list2 = extendList(123,[]) 
list3 = extendList('a') 

print "list1 = %s " %list1 
print "list2 = %s " %list2 
print "list2 = %s " %list3 

輸出是:

list1 = [10, 'a'] 
list2 = [123] 
list2 = [10, 'a'] 

我試圖理解爲什麼第一個列表,list1,有'a'值。

編輯

我檢查了所有的聯繫,並找到了其begginers蟒蛇「疑難雜症」,而是要感謝的答案,不容選擇既如此i'm與第一個去。

+1

[這個規範答案](http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument)應該幫助 – 2015-01-26 21:46:07

+0

http://stackoverflow.com/q的副本uestions/1132941/python-the-mutable-default-argument中的至少一個驚訝 – davidism 2015-01-26 21:46:43

+3

僅僅因爲它的措詞不同,並沒有使它成爲一個不同的問題。 – davidism 2015-01-26 21:48:04

回答

1

list1具有'a'因爲extendlist('a')創建的列表被附加到相同的列表爲extendList(10)

這無疑是在默認參數的方式Python的交易細節的結果,它的狀態模型。你甚至可以認爲這是一個錯誤,因爲它違反了閉包屬性(如果Python的方法應該是閉包)。

例如等效代碼在紅寶石:

def extendList(val, list=[]) 
    list << val 
    return list 
end 

返回

extendList(10) 
# => [10] 

extendList(123, []) 
# => [123] 

extendList('a') 
# => ['a'] 

這是紅寶石的情況下,因爲Ruby方法是關閉,也就是,每個方法調用隨身攜帶它自己的本地環境。

+1

。 。並且在所有3個'extendList'都被評估之後'print'纔會發生。 – WAF 2015-01-26 21:50:40

1

其實,這不是基本的,這是一個有點蟒蛇陷阱的:Mutable Default Parameter

與印刷比較每個函數調用後:

>>> def extendList(val,list=[]): 
...  list.append(val) 
...  return list 
... 
>>> list1 = extendList(10) 
>>> print "list1 = %s " %list1 
list1 = [10] 
>>> list2 = extendList(123,[]) 
>>> print "list2 = %s " %list2 
list2 = [123] 
>>> list3 = extendList('a') 
>>> print "list2 = %s " %list3 
list2 = [10, 'a'] 

另外:

>>> list1 is list2 
False 
>>> list1 is list3 
True 
+0

看到這個代碼,我沒有在第一個列表中找到'a'。 WTF。傑傑奧 – NachoMiguel 2015-01-26 21:53:01

相關問題