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

4

1 回答 1

2

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

请参阅此处:“Least Astonishment”和可变默认参数

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

简短版本是在定义函数时评估默认参数,而不是在函数像您期望的那样运行时进行评估。

于 2013-10-26T01:56:22.590 回答