类和可选参数的奇怪问题

Ube*_*per 0 python

好的,所以这让我整天疯狂.

为什么会这样:

class Foo:
    def __init__(self, bla = {}):
        self.task_defs = bla
    def __str__(self):
        return ''.join(str(self.task_defs))

a = Foo()
b = Foo()
a.task_defs['BAR'] = 1
print 'B is ==> %s' % str(b)
print 'A is ==> %s' % str(a)
Run Code Online (Sandbox Code Playgroud)

给我输出:

B is ==> {'BAR': 1}
A is ==> {'BAR': 1}
Run Code Online (Sandbox Code Playgroud)

我知道它与python通过引用传递所有内容有关.

但为什么会这样呢?这实际上让我一整天都疯了,基本上让我把我的东西拆开了.难道python不应该足够聪明来处理这样的事情吗?

Eva*_*ark 6

由于您bla最初在参数中设置了一个可变类型(在本例中为dict),因此它bla不会被重新初始化为每个为其创建的实例的新dict实例Foo.在这里,试试这个:

class Foo:
    def __init__(self, bla=None):
        if bla is None:
            bla = {}
        self.task_defs = bla
    def __str__(self):
        return ''.join(str(self.task_defs))

a = Foo()
b = Foo()
a.task_defs['BAR'] = 1
print 'B is ==> %s' % str(b)
print 'A is ==> %s' % str(a)
Run Code Online (Sandbox Code Playgroud)