Код: Выделить всё
def foo(a=[]):
a.append(5)
return a
Код: Выделить всё
>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()
Редактировать:
Бачек привел интересный пример. Вместе с большинством ваших комментариев и особенно Утаала я уточнил:
Код: Выделить всё
def a():
print("a executed")
return []
def b(x=a()):
x.append(5)
print(x)
a executed
>>> b()
[5]
>>> b()
[5, 5]
Выполнение привязки внутри функции будет означать, что x фактически привязан к указанному значению по умолчанию, когда функция вызывается, а не определена, что представляет собой серьезный недостаток: строка def будет выглядеть так: «гибридный» в том смысле, что часть привязки (объекта функции) будет происходить при определении и часть (присвоение параметров по умолчанию) во время вызова функции.
Фактическое поведение более последовательное: все в этой строке оценивается при выполнении этой строки, то есть при определении функции. .
Подробнее здесь: https://stackoverflow.com/questions/113 ... t-argument
Мобильная версия