为什么局部变量在这种情况下被“记住”?

时间:2013-10-26 01:55:05

标签: python regex recursion scope default-parameters

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不知何故不会被遗忘,新值只会附加到旧值 - 而不是字符串,正如函数名称所示,被分割它自己的清单。是的,如果我在没有默认参数的情况下定义我的函数,而是在调用后面说它是空列表,那么一切都很好,但我很好奇上面这段代码到底发生了什么。

1 个答案:

答案 0 :(得分:2)

在Python中使用列表作为默认参数会产生令人惊讶的结果,因为它是可变的,因此(w,li=[])不是你想要的。

见这里:"Least Astonishment" and the Mutable Default Argument

在这里:http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/

简短版本是在定义函数时评估默认参数,当函数运行时, not 就像你期望的那样。