如何在初始化器中使用关键字args而不在类实例之间共享它?
下面是不良行为的示例,如果我要向集合中添加任何内容,则将foo
在两个实例中都添加它。
In [1]: class Klass:
def __init__(self, foo=set()):
self.foo = foo
In [2]: a = Klass()
In [3]: b = Klass()
In [4]: a.foo is b.foo
Out[4]: True
请注意,仅可变的默认参数会发生此问题-请参阅“最小惊讶”和可变默认参数。要使用可变的默认参数,通常None
在函数定义中将default设置为,然后在函数内部检查是否已提供值:
class Klass:
def __init__(self, foo=None):
if foo is None:
foo = set()
self.foo = foo
或者:
self.foo = foo if foo is not None else set()
请注意,它None
是通过身份(if foo is None:
)而不是平等(if foo == None:
)或真实性(if not foo:
)进行测试的。例如,如果您想显式传递已引用else的空集,则后者是一个问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句