为什么新对象的属性引用了先前对象的相同属性?

时间:2015-08-26 18:12:22

标签: python object attributes

我使用以下代码创建对象列表。每个对象都有一个属性。每次创建对象时,都会调用init方法为其提供初始值,然后将新值存储在属性中。

class Obj():
    a = []

    def init(self):
        for i in range(2):
            self.a.insert(i, 0)


# Main
object_list = []

for i in range(5):
    if i == 0:
        aux = Obj()
        aux.init()    
    else:
        object_list.append(aux)
        aux = Obj()
        aux.init()       

    for j in range(2): 
        aux.a[j] = random.randint(0,50)

for i in range(len(object_list)):
    print object_list[i].a

预期输出将是这样的,其中打印属性的长度为2:

[21, 9]
[3, 43]
[1, 33]
[5, 12]

但是我得到了类似的东西:

[37, 15, 26, 9, 5, 16, 15, 16, 42, 31]
[37, 15, 26, 9, 5, 16, 15, 16, 42, 31]
[37, 15, 26, 9, 5, 16, 15, 16, 42, 31]
[37, 15, 26, 9, 5, 16, 15, 16, 42, 31]

我知道问题是新创建的对象的属性a指向前一个属性a,因此我对所有对象只有一个a属性

为什么创建新对象并不意味着创建不同的属性而不是对先前对象属性的引用?

1 个答案:

答案 0 :(得分:2)

您的a = []是一个类属性,因此将与您为该类创建的所有对象共享。如果您使用__init__方法并将a = []放在那里,请执行以下操作:

class Obj():
    def __init__(self):
        self.a = []
然后你没有遇到问题