考虑文件my_module.py中的代码:
class A(object):
def __init__(self, x=er()):
self.x = x
现在,当我导入这个模块时
import my_module
我收到错误,
name 'er is not defined
虽然我知道my_module没有定义er
,但我从不创建class A
的实例。因此,在简单地导入模块时,python试图执行__init__
回调是令人费解的。虽然__init__
调用没有完全执行,如下例所示:
class A(object):
def __init__(self, x=5):
self.x = x
print ('I am here')
现在,当我导入模块时 - 没有打印任何内容,这是预期的行为。
我很困惑为什么在我没有实例化er
的对象时,在第一个例子中调用了函数class A
。任何解释这个的文档的指针?
答案 0 :(得分:3)
因为在Python中,默认参数值是在定义时间计算的。例如,请参阅此question或this notorious question。
记录在案here
在函数定义点评估默认值 在定义范围内,以便
i = 5 def f(arg=i): print(arg) i = 6
f()
将打印5。重要警告:默认值仅评估一次。这个 当默认值是可变对象(如a)时,会有所不同 列表,字典或大多数类的实例。例如, 以下函数累积传递给它的参数 后续电话:
def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3))
这将打印
[1] [1, 2] [1, 2, 3]
如果您不希望在后续通话之间共享默认值, 你可以这样编写这样的函数:
def f(a, L=None): if L is None: L = [] L.append(a) return L