问题描述
考虑文件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')
现在,当我导入模块时-没有打印任何内容,这是预期的行为。
我不知道为什么在不实例化class A
的对象时在第一个示例中调用函数er
。
有任何指向说明此问题的文档的指针吗?
1楼
因为在Python中,默认参数值是在定义时间评估的。 参见,例如,这个或 。
在定义范围内的函数定义点评估默认值,以便
i = 5 def f(arg=i): print(arg) i = 6
f()
将打印5。重要警告 :默认值仅计算一次。 当默认值是可变对象(例如列表,字典或大多数类的实例)时,这会有所不同。 例如,以下函数累积在后续调用中传递给它的参数:
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