2011-09-28 57 views
1

可能重複:
「Least Astonishment」 in Python: The Mutable Default Argument爲什麼這個局部變量可以保持它的價值在功能

我最近在Python中遇到了問題。 代碼:

def f(a, L=[]): 
    L.append(a) 
    return L 

print f(1) 
print f(2) 
print f(3) 

輸出將

[1] 
[1, 2] 
[1, 2, 3] 

,但爲什麼在本地列表中的值:在函數F左保持不變? 因爲L是一個局部變量,我想輸出應該是:

[1] 
[2] 
[3] 

我嘗試另一種方式來實現這個功能: 代碼:

def f(a, L=None): 
    if L is None: 
    L = [] 
    L.append(a) 
    return L 

這一次,輸出爲:

[1] 
[2] 
[3] 

我只是不明白爲什麼... 有沒有人有一些想法?非常感謝。

+4

閱讀此http://effbot.org/zone/default-values.htm – spicavigo

回答

3

的默認參數實際上定義函數時初始化,因此

def f(L = []): pass 

頗爲相似

global default_L = [] 
def f(L = default_L): pass 

你可以看到這個方式,它是同一個列表對象用於函數的每個調用中。

2

def f(a, L=[])中的列表被定義爲函數被定義。每次您在沒有關鍵字參數的情況下調用該函數時都是相同的列表。

將關鍵字設置爲None並按照您的操作進行檢查/創建是此類行爲的常用工作。

相關問題