Почему эта локальная переменная может сохранять свое значение в функции

Возможный дубликат:
"Наименьшее удивление" в Python: изменчивый аргумент по умолчанию

Недавно я столкнулся с проблемой в Python. Код:

 def f(a, L=[]):
   L.append(a)
   return L

 print f(1)
 print f(2)
 print f(3)

выход будет

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

но почему значение в локальном списке: L в функции f остается неизменным? Поскольку L является локальной переменной, я думаю, что вывод должен быть:

[1]
[2]
[3]

Я попробовал другой способ реализовать эту функцию: Код:

def f(a, L=None):
  if L is None:
  L = []
  L.append(a)
  return L 

На этот раз вывод:

[1]
[2]
[3]

Я просто не понимаю, почему... У кого-нибудь есть идеи? большое спасибо.

2 ответа

Решение

Параметры по умолчанию фактически инициализируются при определении функции, поэтому

def f(L = []): pass

очень похоже на

global default_L = []
def f(L = default_L): pass

Таким образом, вы можете видеть, что это один и тот же объект списка, который используется при каждом вызове функции.

Список в def f(a, L=[]) определяется как функция определяется. Это один и тот же список каждый раз, когда вы вызываете функцию без ключевого аргумента.

Установка ключевого слова на None и проверка / создание, как вы сделали, это обычная работа для такого рода поведения.

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