Почему локальная переменная "запоминается" в этом случае?
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 ответ
Использование списка в качестве аргумента по умолчанию в Python даст удивительные результаты, потому что он изменчив, поэтому (w,li=[])
не то, что вы хотите.
Смотрите здесь: "Наименее удивление" и изменчивый аргумент по умолчанию
и здесь: http://www.deadlybloodyserious.com/2008/05/default-argument-blunders/
Короткая версия заключается в том, что аргументы по умолчанию оцениваются, когда функция определена, а не когда функция запускается так, как вы ожидаете.