Значение пустого списка в параметре функции, например здесь

Возможный дубликат:
«Наименьшее удивление» в Python: аргумент Mutable Default

def f(a, L=[]): L.append(a) return L print(f(1, [1, 2])) print(f(1)) print(f(2)) print(f(3)) 

Интересно, почему другие f (1), f (2), f (3) не присоединяются к первому f (1, [1,2]). Я думаю, результат должен быть:

 [1, 2, 1] [1, 2, 1, 1] [1, 2, 1, 1, 2] [1, 2, 1, 1, 2, 3] 

Но результат не в этом. Я не знаю почему.

2 Solutions collect form web for “Значение пустого списка в параметре функции, например здесь”

Есть два разных вопроса (лучше называемые понятия), объединенные в одну задачу.

Первый связан с SO-вопросом, как указано agh. Нить дает подробное объяснение, и нет смысла объяснять это снова, кроме как для этого потока. Я могу просто воспользоваться привилегией сказать, что функции являются объектами первого класса, а параметры и их значения по умолчанию ограничены во время объявления. Таким образом, параметры действуют как статические параметры функции (если что-то можно сделать возможным на других языках, которые не поддерживают объекты класса первого класса.

Вторая проблема заключается в том, к какому объекту списка привязан параметр L Когда вы передаете параметр, переданный параметр List – это то, к чему привязан L. Когда вызывается без каких-либо параметров, это больше похоже на соединение с другим списком (тот, который упоминается как параметр по умолчанию), который вне курса будет отличаться от того, что было передано при первом вызове. Чтобы сделать дело более заметным, просто измените свою функцию следующим образом и запустите образцы.

 >>> def f(a, L=[]): L.append(a) print id(L) return L >>> print(f(1, [1, 2])) 56512064 [1, 2, 1] >>> print(f(1)) 51251080 [1] >>> print(f(2)) 51251080 [1, 2] >>> print(f(3)) 51251080 [1, 2, 3] >>> 

Как вы можете видеть, первый вызов печатает другой идентификатор параметра L контрастирующий с последующими вызовами. Поэтому, если списки отличаются друг от друга, это будет поведение и значение, которое добавляется. Надеюсь, теперь это должно иметь смысл

Почему вы ожидаете, что это результаты, если вы вызываете функцию, где инициализируйте пустой список, если вы не передадите второй аргумент?

Для тех результатов, которые вы хотите, вы должны использовать закрытие или глобальный var.

  • Объединение параметров выбора файлов и каталогов
  • В Python я могу указать аргумент аргумента функции в терминах других аргументов?
  • Python: Почему параметры функции int & list обрабатываются по-разному?
  • Существует ли конструкция python, которая является фиктивной функцией?
  • Segfault при попытке вызвать функцию Python из C
  • Функции Python: передавать глобальные переменные, если они только обращаются к ним?
  • python: объединить сортировку-функции-item itemterter и str.lower
  • Вызов функции Python очень медленный
  • Python - лучший язык программирования в мире.