2013-10-26 90 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

相关问题