Необязательные параметры в функциях Python и их значения по умолчанию

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

Я немного смущен тем, как работают необязательные параметры в функциях/методах Python.

У меня есть следующий код:

>>> def F(a, b=[]):
...     b.append(a)
...     return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>

Почему F(1) возвращает [0, 1], а не [1]?

Я имею в виду , что происходит внутри?

Ответ 1

Хороший документ от PyCon пару лет назад - Объяснение параметров по умолчанию. Но в принципе, поскольку списки являются изменяемыми объектами, а аргументы ключевых слов оцениваются во время определения функции. Поэтому каждый раз, когда вы вызываете функцию, вы получаете то же значение по умолчанию.

Правильный способ сделать это:

def F(a, b=None):
    if b is None:
        b = []
    b.append(a)
    return b

Ответ 2

Параметры по умолчанию довольно интуитивно несколько похожи на переменные-члены в объекте функции.

Значения параметров по умолчанию оцениваются при выполнении определения функции. Это означает, что выражение оценивается один раз, когда функция определена, и то же самое "предварительно вычисленное" значение используется для каждого вызова. Это особенно важно для понимания, когда параметр по умолчанию является изменяемым объектом, таким как список или словарь: если функция изменяет объект (например, добавив элемент в список), значение по умолчанию изменяется.

http://docs.python.org/reference/compound_stmts.html#function

Списки - изменяемые объекты; вы можете изменить их содержимое. Правильный способ получить список по умолчанию (или словарь или набор) состоит в том, чтобы создать его во время выполнения, внутри функции:

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list