Python实例和属性:这是一个错误还是我完全错了?

Mir*_*ini 5 python attributes class instance

假设你有这样的东西:

class intlist:
        def __init__(self,l = []):
                self.l = l
        def add(self,a):
                self.l.append(a)

def appender(a):
        obj = intlist()
        obj.add(a)
        print obj.l

if __name__ == "__main__":
        for i in range(5):
                appender(i)
Run Code Online (Sandbox Code Playgroud)

函数创建一个intlist实例,并在该新实例上调用该方法附加在实例属性l上.

为什么这段代码的输出是:

[0]

[0,1]

[0,1,2]

[0,1,2,3]

[0,1,2,3,4]

?如果我切换

obj = intlist()
Run Code Online (Sandbox Code Playgroud)

obj = intlist(l=[])
Run Code Online (Sandbox Code Playgroud)

我得到了所需的输出

[0]

[1]

[2]

[3]

[4]

为什么会这样?

谢谢

Dav*_*ver 14

啊,你已经遇到了一个常见的Python陷阱:默认值计算一次,然后重新使用.因此,每次__init__调用时,都会使用相同的列表.

这是Pythonic做你想做的事情的方式:

def __init__(self, l=None):
    self.l = [] if l is None else l
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看Python文档(特别是该标题后面的三个段落).

编辑:在另一个答案中一个更好的描述.

  • 对.通常,您可能不希望将可变类型用作默认值. (4认同)