变量(参数)不重新实例化

Variable (argument) does not re-instantiate

我注意到 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 没有像我预期的那样重新实例化。

这背后的原因是什么?

a=foo() 只会在模块加载后评估一次。当您调用该函数时,它将 而不是 再次获得 运行 。函数的默认参数总是这样。

函数参数的默认值是在定义函数时计算的,而不是在调用函数时计算的。

在定义函数时计算并存储默认值。

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

表达式foo()不存储为默认值,稍后调用;计算表达式的结果是。

参数 a 仍然是局部变量,但它引用了一个对象,如果没有参数传递给调用,则它引用由 f 的所有调用共享的对象。