Python 为什么要更改列表中所有对象的属性?

Python 为什么要更改列表中所有对象的属性?,python,duplicates,Python,Duplicates,我想用python创建对象数组 class user: j = [0, 0] AllUsers = [] AllUsers.append(user) AllUsers.append(user) AllUsers[0].j[0] = 1 for i in AllUsers: print(i.j) 我希望产出: [1,0] [0, 0] 但我得到: [1,0] [1, 0] 错在哪里 因此,我在“数组数组”中看到了类似的问题,但我无法使用它们的解决方案。您混淆了实例和类。

我想用python创建对象数组

class user:
    j = [0, 0]

AllUsers = []
AllUsers.append(user)
AllUsers.append(user)

AllUsers[0].j[0] = 1

for i in AllUsers:
    print(i.j)
我希望产出:

[1,0]
[0, 0]
但我得到:

[1,0]
[1, 0]
错在哪里


因此,我在“数组数组”中看到了类似的问题,但我无法使用它们的解决方案。

您混淆了实例和类。以下是一个工作示例:

class user:
    def __init__(self):
        self.j = [0, 0]


AllUsers = []
AllUsers.append(user())  # note the extra () which creates a new instance
AllUsers.append(user())

AllUsers[0].j[0] = 1

for i in AllUsers:
    print(i.j)

我想这就是你试图粘贴的代码

class user:
    j = [0, 0]

AllUsers = []
AllUsers.append(user)
AllUsers.append(user)

AllUsers[0].j[0] = 1

for i in AllUsers:
    print(i.j)
主要有两个问题。首先,
alluser
是一个列表,而不是一个数组。其次,您要将一个类附加到列表中,而不是该类的实例。为了实现您的目标,您需要创建附加的用户类的实例。那看起来更像

AllUsers.append(user())

为了便于格式化,通常最好在类中使用大写的第一个字母,这样就可以很容易地将它们与变量和类实例区分开来。

我没有看到任何数组。你的缩进是关闭的。你的问题的答案在于类和实例属性。考虑阅读。你没有在< ALLUSER 列表中放置类<代码>用户< /代码>。但是,即使您将不同的实例放入(通过使用
user()
创建它们),您仍然会遇到问题,因为
j
已定义为类级属性,这意味着它由类的所有实例共享。无论哪种方式的结果都是,通过任何一种方式更改
j
的值都会有效地更改列表中所有现有成员中的值