如何使用关键字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
如何使用关键字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
在函数定义,然后检查的值是否已经被提供在函数内部:
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:
例如,后者则是一个问题,如果你想在你elsewere引用空集明确地传递。