2013-02-11 46 views
0

我打開了我的python解釋器,編碼並運行以下函數。爲什麼我的函數不斷返回一個更長的列表?

>>> def crazy_function(my_list=[]): 
...  my_list.append(0) 
...  return my_list 
... 
>>> crazy_function() 
[0] 
>>> crazy_function() 
[0, 0] 
>>> crazy_function() 
[0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0, 0, 0] 
>>> crazy_function() 
[0, 0, 0, 0, 0, 0, 0] 
>>> 

這是怎麼回事?爲什麼函數返回的列表越多,我稱之爲函數的時間越長?每次調用函數時都不應創建新的本地列表?

+0

蟒蛇成立:d – dangerChihuahua007 2013-02-11 02:09:59

+4

這個被問了很多 - 參見[Python中的「最小驚訝」:易變的默認參數(http://stackoverflow.com/questions/1132941/least-astonishment-in-python -the-mutable-default-argument) – 2013-02-11 02:10:30

+0

這些問題總是會關閉* SO FAST *。這令人印象深刻。 – mgilson 2013-02-11 02:12:22

回答

2

將可變對象分配給函數參數的默認值是一個常見錯誤。引述documentation:當函數定義執行

默認參數值進行了評價。這意味着該表達式會在定義 函數時評估一次,並且針對每個調用使用相同的「預先計算」值 。這對於瞭解何時 默認參數是可變對象(如列表或字典)尤爲重要:如果函數修改對象(例如,通過將項目附加到 列表),默認值實際上被修改。這通常不是 意圖。

相關問題