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
不知何故不会被遗忘,新值只会附加到旧值 - 而不是字符串,正如函数名称所示,被分割它自己的清单。是的,如果我在没有默认参数的情况下定义我的函数,而是在调用后面说它是空列表,那么一切都很好,但我很好奇上面这段代码到底发生了什么。
答案 0 :(得分:2)
在Python中使用列表作为默认参数会产生令人惊讶的结果,因为它是可变的,因此(w,li=[])
不是你想要的。
见这里:"Least Astonishment" and the Mutable Default Argument
在这里:http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/
简短版本是在定义函数时评估默认参数,当函数运行时, not 就像你期望的那样。