初始化使用Python中的关键字参数数量没有实例之间共享(Initialising in Pytho

2019-10-22 01:12发布

如何使用关键字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

Answer 1:

请注意,这个问题将只能可变默认参数发生-见“最小惊讶”和易变的默认参数 。 使用一个可变的默认参数,常规的做法是默认值设置为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引用空集明确地传递。



文章来源: Initialising in Python using Keyword Args without sharing between instances