2013-07-17 16 views
1

嗨的函數隨後調用我是新來的蟒蛇。有人可以解釋下面兩段代碼是如何給出不同的輸出的?每次調用函數時都定義函數嗎?論點在python

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



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

上運行

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

我分別

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



[1] 
[2] 
[3] 

回答

2

得到這些輸出這是一個很常見的 '疑難雜症' 的新的Python開發。在第一個例子中,看起來像就像每次調用沒有第二個參數的函數時應該創建一個新的空列表。事實並非如此。當創建函數對象時,創建單個列表,這基本上是在加載python腳本或完成在交互式shell中輸入函數時。這個列表然後用於每個函數的調用,因此您看到的是標準。

二是工作這一輪的標準方式,並創建一個新的列表實例的每個函數被調用時沒有第二個參數的時間。

在封面下方,Python將它在函數定義中找到的任何默認值放入函數的屬性中,默認值爲。你可以看到相同的情況下是如何在交互式shell調用之間存在着

>>> def f(a,b=[]): 
...  b.append(a) 
>>> f.__defaults__ 
([],) 
>>> f(1) 
>>> f.__defaults__ 
([1],) 
>>> f(2) 
>>> f.__defaults__ 
([1,2],) 
0

在Python默認參數的函數聲明點進行評估 - 當它第一次被解釋看到的。

在你的第一個片段中,L說法是「給予」的列表作爲默認,所以值附加。

在第二個片段中,L在進入函數時總是None,所以每次都重新創建。

0

定義函數時,此功能默認參數進行評估。 在你的情況def f(a, L=[]):創建一個空的列表,然後將其傳遞的每個函數被調用,而不L參數的時間。所以每個函數調用都在同一個列表上運行,這就是爲什麼每次都會輸出不同的輸出。

在你的第二個功能,一個空列表創建的每個函數被調用的時候,所以它按預期工作。