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

Возможный дубликат:
«Наименьшее удивление» в 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] 

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

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

Первый связан с 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.