使用关键字参数在 Python 中初始化而不在实例之间共享
Initialising in Python using Keyword Args without sharing between instances
如何在初始化程序中使用关键字参数而不在 class 的实例之间共享它?
下面的不良行为示例,如果我要向集合中添加任何内容 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
请注意,此问题 仅 与 可变默认参数 一起出现 - 请参阅 "Least Astonishment" and the Mutable Default Argument。要使用可变默认参数,通常在函数定义中将默认值设置为 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:
) 来测试的。例如,如果你想显式传递一个你在其他地方引用的空集,后者就是一个问题。
如何在初始化程序中使用关键字参数而不在 class 的实例之间共享它?
下面的不良行为示例,如果我要向集合中添加任何内容 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
请注意,此问题 仅 与 可变默认参数 一起出现 - 请参阅 "Least Astonishment" and the Mutable Default Argument。要使用可变默认参数,通常在函数定义中将默认值设置为 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:
) 来测试的。例如,如果你想显式传递一个你在其他地方引用的空集,后者就是一个问题。