Переменная (аргумент) не создает экземпляр [дубликата]

Я заметил следующее поведение в Python:

>>> class foo:
...     def __init__(self, x=0):
...             self.x = x
...     def bar(self):
...             self.x = self.x + 1
... 
>>> def f(a=foo()):
...     a.bar()
...     return a
... 
>>> c = f()
>>> c.x
1
>>> d = f()
>>> d.x
2
>>> d == c
True

Это как если бы переменная a стала глобальной, что не соответствует действительности, но все еще вызывает метод f а переменная a не создает экземпляр, как я ожидал.

В чем причина этого?

Всего 3 ответа


Значения аргументов функции по умолчанию оцениваются во время определения функции, а не при ее вызове.


Значения по умолчанию оцениваются и сохраняются во время определения функции.

>>> f.__defaults__
(<__main__.foo object at 0x105c02860>,)

Выражение foo() не сохраняется по умолчанию и будет вызвано позже; Результатом оценки выражения является.

Параметр a по-прежнему является локальной переменной, но он ссылается на объект, который используется всеми вызовами f если в вызов не передан аргумент.


a=foo() будет оценен только один раз после загрузки модуля. Он не запустится снова при вызове функции. Аргументы по умолчанию для функций всегда ведут себя так.


Есть идеи?

10000