Можно создать дубликат:
“Least Astonishment” in Python: The Mutable Default Argumentфункции Python и пустые строки
Edit: Это не имеет ничего общего с recusion и просто изменяемые аргумент по умолчанию функция: "Least Astonishment" and the Mutable Default Argument
Многие спасибо
Я использую python 2.7.2 на win7 64bit машина и есть рекурсивная функция, которая действует на элемент LXML, функция выглядит следующим образом:
def recursive_search(start, stack = []):
for element in start.getchildren():
if condition1(element):
stack = recursive_search(element, stack)
elif condition2(element)
stack.append(element)
else:
pass
return stack
Когда я вызываю функцию впервые с:
output = recursive_search(starting_element)
Он отлично работает и Я получаю то, что я ожидал, но если я называю его снова с точно такой же командой я получаю вдвое больше, чем я ожидал, как если бы я назвал:
output += recursive_search(starting_element)
или если стек был глобальной переменной. Если я называю это в третий раз я получаю 3 раза выход и т.д. и т.п.
Если я позвоню:
output = recursive_search(starting_element, [])
Тогда я могу назвать это столько раз, сколько мне нравится, и я не получаю аномальное поведение.
Аналогично, если я изменить функцию таким образом, что он читает:
def recursive_search(start, stack = []):
if stack == []:
stack = []
for element in start.getchildren():
if condition1(element):
stack = recursive_search(element, stack)
elif condition2(element)
stack.append(element)
else:
pass
return stack
, то я могу назвать:
output = recursive_search(starting_point)
столько раз, сколько мне нравится, и снова не получить аномальное поведение.
Мой вопрос: что происходит - это ошибка или есть правило, о котором я не знаю, передавая пустые строки в рекурсивные функции в python?
Ну, [изменяемый аргумент по умолчанию] (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument) снова ... –
Да, нечего делать с рекурсивными функциями. –
aha, спасибо. –