Почему локальная переменная "запоминается" в этом случае?

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/

Короткая версия заключается в том, что аргументы по умолчанию оцениваются, когда функция определена, а не когда функция запускается так, как вы ожидаете.

Другие вопросы по тегам