Python 为什么局部变量得到;“记住”;在这种情况下?
这对于第一次调用来说是可行的,但是局部变量Python 为什么局部变量得到;“记住”;在这种情况下?,python,regex,recursion,scope,default-parameters,Python,Regex,Recursion,Scope,Default Parameters,这对于第一次调用来说是可行的,但是局部变量li不会被忘记,新值只是附加到旧值上,而不是像函数名所示的字符串,被拆分到它自己的列表中。是的,如果我在没有默认参数的情况下定义我的函数,然后在调用中说它是空列表,一切都很好,但我很好奇上面的代码到底发生了什么。在Python中使用列表作为默认参数将产生令人惊讶的结果,因为它是可变的,所以(w,li=[])不是您想要的 请看这里: 在这里: 简而言之,默认参数是在定义函数时计算的,而不是在函数按预期运行时计算的。好吧,您可以使用它,它会工作,只是可能不完
li
不会被忘记,新值只是附加到旧值上,而不是像函数名所示的字符串,被拆分到它自己的列表中。是的,如果我在没有默认参数的情况下定义我的函数,然后在调用中说它是空列表,一切都很好,但我很好奇上面的代码到底发生了什么。在Python中使用列表作为默认参数将产生令人惊讶的结果,因为它是可变的,所以(w,li=[])
不是您想要的
请看这里:
在这里:
简而言之,默认参数是在定义函数时计算的,而不是在函数按预期运行时计算的。好吧,您可以使用它,它会工作,只是可能不完全符合预期。@Bogdan对,澄清了。谢谢您的回答和链接。“一旦你开始考虑这种方式,那么它就完全有意义了:函数是一个根据其定义求值的对象;默认参数是一种“成员数据”,因此它们的状态可能会从一个调用变为另一个调用——与任何其他对象完全一样”(从最好的答案来看,这是一个很好的解释!)
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)