当前位置: 代码迷 >> python >> 导入带有类定义的python模块时发生意外行为
  详细解决方案

导入带有类定义的python模块时发生意外行为

热度:126   发布时间:2023-06-13 13:37:51.0

考虑文件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 有任何指向说明此问题的文档的指针吗?

因为在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