如何将用户类对象添加到对象列表

时间:2019-05-22 12:57:06

标签: python

我试图将对象追加到对象列表中,但是该对象类的所有属性都与上一个条目相同

我发现在我的for循环中声明该对象可以解决问题,但是不明白为什么... (似乎列表中的所有对象都引用相同的对象)

首先我声明:

class SimpleClass:
    name = ""
simplelist = []

这有效:

for count in range(4):
    x = SimpleClass()
    x.name = count
    simplelist.append(x)

这不起作用(“ simplelist []。name”中的所有值都等于3)-为什么?

x = SimpleClass()
for count in range(4):    
    x.name = count
    simplelist.append(x)

4 个答案:

答案 0 :(得分:0)

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div>text</div> <div>text</div> <div>text</div> <div>text</div> <div>text</div>创建the instance of class(类似于这种类型的对象)。

如果在循环之外运行它,则只有一个对象并尝试对其进行更改。在这种情况下,x = SimpleClass()会将此唯一对象附加到列表中(并且每次都会更改),因此您将拥有一个包含一个对象的许多副本的列表。

如果在循环中运行它,则有多个实例化一个类的对象。在这种情况下,simplelist.append(x)会将每个新对象追加到列表中,因此您将拥有一个包含许多不同对象的列表。

摘自Python官方文档:

  

类实例化使用函数符号。只是假装类对象是一个无参数函数,它将返回该类的新实例。例如(假设上面的类):

     

simplelist.append(x)

     

创建该类的新实例,并将该对象分配给局部变量x。

     

实例化操作(“调用”类对象)创建一个空对象。许多类喜欢创建具有定制为特定初始状态的实例的对象。

答案 1 :(得分:0)

在第二种情况下,您仅创建该类的一个对象。然后,您更改此对象,并由此更改列表中该对象的所有现有副本。

答案 2 :(得分:0)

这是因为您仅创建一个对象,并将其添加到列表中4次。所有对象(因此是相同对象的4倍)将具有与name相同的值,并且将是3,因为这是您在loop中所做的最后一个修改。

答案 3 :(得分:0)

在您的情况下,xSimpleClass类的实例。实际上,它是一个引用/指针,在您的for循环中没有更改。您只能更改name类的SimpleClass属性的值。因此,您的列表将包含3次相同的引用。