1

可能的重复:
Python 中的“Least Astonishment”:可变默认参数

我不确定这叫什么,因此很难找到正在发生的事情的文档。我希望这里的某个人能够指出我正确的方向。

在下面的示例中,我有一个列表作为关键字参数的默认值,它的行为方式是我没想到的:

class A(object):
    def __init___(self, c=[0,0]):
        self.c = c

class B(A):
    def __init__(self):
        super(B, self).__init__()

a = A()
b = B()

print a.c, b.c  # outputs [0, 0] [0, 0]

a.c[1] = 5

print a.c, b.c  # outputs [0, 5] [0, 5]

我知道列表是可变的,但我假设在使用列表作为默认关键字参数的情况下,每次都会创建一个“新”列表。是否有文档解释为什么不是这种情况?

4

1 回答 1

1

Python 一次创建一个您指定为默认值的列表,然后通过引用分配它。所以:

>>> a1, a2 = A(), A()
>>> a1.c is a2.c
True
>>> a1.c.append(42)
>>> a2.c
[42]

使用这个:

class A(object):
    def __init___(self, c=None):
        self.c = c if c is not None else [0, 0]

有关更多信息,请阅读内容,也可以查看此热门问题

于 2012-10-12T08:48:16.093 回答