2013-10-26 89 views
0
def word_to_syllable(w,li=[]): 
    if not w: 
    return li 
    pattern = """ 
      ######## 
      """ 
    pattern = re.sub("C","[^aeiou]",pattern) 
    pattern = re.sub("V","[aeiou]",pattern) 
    match = re.findall(pattern,w,re.VERBOSE)[0] 
    #print(li) 
    li.append(match) 
    w = w[len(match):] 
    return word_to_syllable(w,li) 

這對於第一個電話工作好,但隨後局部變量li不知何故沒有被人遺忘,新價值只是附加到舊的 - 而不是字符串,作爲函數的名稱所暗示的,被分割到它的自己的名單。是的,如果我在沒有默認參數的情況下定義我的函數,而是在調用後面說它是空列表,那麼一切都很好,但我很好奇上面這段代碼究竟發生了什麼。爲什麼局部變量在這種情況下被「記住」?

回答

2

在Python中使用列表作爲默認參數會產生令人驚訝的結果,因爲它是可變的,所以(w,li=[])不是你想要的。

在這裏看到:"Least Astonishment" and the Mutable Default Argument

這裏:http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/

短版是定義該函數時默認參數進行評估,時運行該功能像你期望的那樣。

+0

那麼,你可以使用它,它會工作,也許不像預期的那樣。 – fjarri

+0

@Bogdan對,澄清。 –

+0

感謝您的回答,併爲鏈接。 「一旦你思考這種方式,那麼它就完全有意義:函數是一個正在被定義的對象;默認參數是」成員數據「,因此它們的狀態可能會從一個調用改變到其他 - 與其他任何對象一樣「(從那裏的最佳答案,很好的解釋!) – user2921960

相關問題