我试图将对象追加到对象列表中,但是该对象类的所有属性都与上一个条目相同
我发现在我的for循环中声明该对象可以解决问题,但是不明白为什么... (似乎列表中的所有对象都引用相同的对象)
class SimpleClass:
name = ""
simplelist = []
for count in range(4):
x = SimpleClass()
x.name = count
simplelist.append(x)
x = SimpleClass()
for count in range(4):
x.name = count
simplelist.append(x)
答案 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)
在您的情况下,x
是SimpleClass
类的实例。实际上,它是一个引用/指针,在您的for
循环中没有更改。您只能更改name
类的SimpleClass
属性的值。因此,您的列表将包含3次相同的引用。