将实例中的变量添加到list-Python时不起作用

将实例中的变量添加到list-Python时不起作用,python,class,Python,Class,为什么这不符合预期(至少对我来说)?我不明白为什么 class Fred: def __init__(self): self.a=0 fred=Fred() lista=[] for i in range(5): fred.a=i lista.append(fred) for i in lista: print(str(i.a)) 我得到的是数字4的5倍,而不是从0到4。有什么评论吗? 谢谢现在发生的事情是,每次您在范围(5)中循环i时

为什么这不符合预期(至少对我来说)?我不明白为什么

class Fred:
    def __init__(self):
          self.a=0

fred=Fred()
lista=[]

for i in range(5):
    fred.a=i
    lista.append(fred)

for i in lista:
    print(str(i.a))
我得到的是数字4的5倍,而不是从0到4。有什么评论吗?
谢谢

现在发生的事情是,每次您在范围(5)中循环i时,对Fred的引用都会被覆盖。如果您将
fred=fred()
移动到该循环中,并每次创建一个新对象,那么您应该会看到预期的结果。

所发生的情况是,每次在
范围(5)
内的i中循环时,对fred的引用都会被覆盖。如果您将
fred=fred()
移动到该循环中并每次创建一个新对象,那么您应该会看到预期的结果。

您有一个
fred
实例,并不断将该实例添加到列表中,同时更改其
a
属性。添加到列表不会复制
Fred
对象;它只是向同一对象添加另一个引用。您可以通过在循环的每个迭代中创建一个新的
Fred
来获得预期的行为。

您有一个
Fred
实例,并不断将该实例添加到列表中,同时更改其
属性。添加到列表不会复制
Fred
对象;它只是向同一对象添加另一个引用。您可以通过在循环的每个迭代中创建一个新的
Fred
来获得预期的行为。

这是bcoz
lista
中的所有元素都引用同一个元素,,您看到的数字是4,因为它是对象的最新更新值
fred
这是bcoz
lista
中的所有元素都引用了同一个元素,您看到的数字是4,因为它是对象的最新更新值
fred