使用关键字参数在 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:) 来测试的。例如,如果你想显式传递一个你在其他地方引用的空集,后者就是一个问题。