变量(参数)不重新实例化
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
的所有调用共享的对象。
我注意到 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
的所有调用共享的对象。