类和可选参数的奇怪问题

时间:2009-07-15 19:05:05

标签: 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)

给我输出:

B is ==> {'BAR': 1}
A is ==> {'BAR': 1}

我知道它与python通过引用传递所有东西有关。

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

1 个答案:

答案 0 :(得分: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)