列表中更新的列表

时间:2012-10-25 14:35:08

标签: python list class

class A(object):
    aalist = []
    ai = 0
    def __init__(self):
    self.ablist = list()
    def add(self):
        self.aalist.append(["a","a"])
        self.ablist.append(["b","b"])
        self.ai = self.ai + 1
class B(A):
    def __init__(self):
        A.__init__(self)
        self.bblist = list()
    def badd(self):
        self.bblist.append(['c','c'])
for i in range(1,4):
    c = B()
    c.add()
    c.badd()
    print c.aalist,c.ablist,c.bblist,c.ai

运行这些代码,结果提示:

[['a', 'a']] [['b', 'b']] [['c', 'c']] 1
[['a', 'a'], ['a', 'a']] [['b', 'b']] [['c', 'c']] 1
[['a', 'a'], ['a', 'a'], ['a', 'a']] [['b', 'b']] [['c', 'c']] 1

我不知道为什么列表在循环中得到更新,而int似乎保持静态

1 个答案:

答案 0 :(得分:2)

你正在与他们进行完全不同的操作。请注意,当您执行self.ai时,整数分配给self.ai = self.ai + 1。使用列表时,可以使用append对其进行处理。另请注意,由于您使用的是int(不可变),因此无法更改其值。

还有证据表明您正在探索类变量与实例变量。请注意,在您的示例中,ablistbblist是实例变量,而aalist是类变量。您可以在方法(self.XXlist)中以相同的方式访问它们,但是当您变异self.aalist时,您将改变类上的版本。换句话说,self.aalist is A.aalist将返回True。这允许您的类的所有实例共享相同的列表。当一个人更新列表时,所有其他实例将立即知道(除非他们绑定具有相同名称的实例级别属性 - 该变量将在属性查找中优先。)