Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么局部变量得到;“记住”;在这种情况下?_Python_Regex_Recursion_Scope_Default Parameters - Fatal编程技术网

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)