Почему эта локальная переменная может сохранять свое значение в функции
Возможный дубликат:
"Наименьшее удивление" в 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
и проверка / создание, как вы сделали, это обычная работа для такого рода поведения.