对象创建时未创建Python新列表

对象创建时未创建Python新列表,python,list,oop,Python,List,Oop,我正在用python进行OOP练习,遇到了一个非计算机科学家头脑无法理解的问题。我确信这只是因为我对OO缺乏经验,但我似乎在任何地方都找不到答案 所以我有三节课。一个名为tester的类,它应该包含一个名为group的唯一对象,该对象应该包含一个名为atom的对象列表。我的问题是,每当我创建多个组时,它们似乎都具有相同的列表对象。因此,每当我将一个原子附加到列表中时,它就会被附加到组的所有列表中。我的代码是: count = 0 testers = [] class atom: def

我正在用python进行OOP练习,遇到了一个非计算机科学家头脑无法理解的问题。我确信这只是因为我对OO缺乏经验,但我似乎在任何地方都找不到答案

所以我有三节课。一个名为tester的类,它应该包含一个名为group的唯一对象,该对象应该包含一个名为atom的对象列表。我的问题是,每当我创建多个组时,它们似乎都具有相同的列表对象。因此,每当我将一个原子附加到列表中时,它就会被附加到组的所有列表中。我的代码是:

count = 0
testers = []

class atom:
    def __init__(self):
        pass

class group:
    myList = list()
    def __init__(self):
        pass

    def createAtom(self):
        self.myList.append(atom())


class tester:
    def __init__(self):
        self.myGroup = group()

for k in range(4):
    testers.append(tester())
    print testers[k].myGroup

for t in testers:
    t.myGroup.createAtom()
    print t.myGroup.myList
我希望这会为每个组创建一个新的列表,并为每个组添加一个原子。而是创建如下输出

<__main__.group instance at 0x02C2E058>
<__main__.group instance at 0x02C2E0A8>
<__main__.group instance at 0x02C2E0F8>
<__main__.group instance at 0x02C2E148>
[<__main__.atom instance at 0x02C2E170>]
[<__main__.atom instance at 0x02C2E170>, <__main__.atom instance at 0x02C2E198>]
[<__main__.atom instance at 0x02C2E170>, <__main__.atom instance at 0x02C2E198>, <__main__.atom instance at 0x02C2E1C0>]
[<__main__.atom instance at 0x02C2E170>, <__main__.atom instance at 0x02C2E198>, <__main__.atom instance at 0x02C2E1C0>, <__main__.atom instance at 0x02C2E1E8>]
一张单子可以得到所有四个原子。我为我可能的错误代码道歉。如果有帮助的话,我使用的是python portable 2.7.5.1。如能对此有所了解,将不胜感激


谢谢

您的列表是一个类属性,在所有实例中共享:

class group:
    myList = [] # class attribute
    def __init__(self):
        pass
相反,将其作为一个实例属性,对类的每个实例进行分离:

class group:
    def __init__(self):
        self.myList = [] # instance attribute

请注意,根据Fourtheye的评论,我已将列表替换为[]。隐藏内置项(例如拥有自己的列表或其他名为list的对象)是一种不好的做法,但如果规则被破坏,这可以避免副作用。

您的列表是一个类属性,在所有实例中共享:

class group:
    myList = [] # class attribute
    def __init__(self):
        pass
相反,将其作为一个实例属性,对类的每个实例进行分离:

class group:
    def __init__(self):
        self.myList = [] # instance attribute
请注意,根据Fourtheye的评论,我已将列表替换为[]。隐藏内置项(例如拥有自己的列表或其他名为list的对象)是一种不好的做法,但如果规则被破坏,这可以避免副作用。

您已创建group.myList a,由所有实例共享

class group:
    #myList = list()       # <--- this defines a 'class' attribute
                           #      which is shared by all instances of 'group'
    def __init__(self):
        self.myList = list()  # <--- do this instead to create an instance attribute

    def createAtom(self):
        self.myList.append(atom())
您已将group.myList设置为a,由所有实例共享

class group:
    #myList = list()       # <--- this defines a 'class' attribute
                           #      which is shared by all instances of 'group'
    def __init__(self):
        self.myList = list()  # <--- do this instead to create an instance attribute

    def createAtom(self):
        self.myList.append(atom())
将类组中的mylist=列表移动到类组的_init__中。 这样做将使组在每次创建新组实例时都创建一个新列表。否则,您所做的只是创建一个类级变量而不是实例级变量,该变量将在同一类的所有实例之间共享

把类变量想象成一种蜂巢思维,把《星际迷航》中的博格结构想象成该类的所有实例。对类变量所做的任何更改都将对该类型的所有对象可见

另一方面,如果要创建一个实例变量,即在uuu init_uuuu中初始化的变量,那么每个实例都有自己的变量值。因此,一个实例对其变量所做的任何更改对于相同类型的其他实例都是不可见的

将类组中的mylist=list移动到类组的uuu init_uuu中。 这样做将使组在每次创建新组实例时都创建一个新列表。否则,您所做的只是创建一个类级变量而不是实例级变量,该变量将在同一类的所有实例之间共享

把类变量想象成一种蜂巢思维,把《星际迷航》中的博格结构想象成该类的所有实例。对类变量所做的任何更改都将对该类型的所有对象可见


另一方面,如果要创建一个实例变量,即在uuu init_uuuu中初始化的变量,那么每个实例都有自己的变量值。因此,一个实例对其变量所做的任何更改对于同一类型的其他实例都是不可见的

Recommend[],列表可以重新分配给其他对象。啊。如果我将myList=list转换为self.myList=list,这就行了。我这样做对吗?还有,到底是什么让某些东西成为类属性而不是实例属性?非常感谢@user3228706类属性是在实例方法之外定义的,正如您在这里所做的,或者在本例中使用类名group.myList。实例属性在实例方法中定义,使用约定self,即特定类实例。建议[],列表可以重新分配给其他对象。啊。如果我将myList=list转换为self.myList=list,这就行了。我这样做对吗?还有,到底是什么让某些东西成为类属性而不是实例属性?非常感谢@user3228706类属性是在实例方法之外定义的,正如您在这里所做的,或者在本例中使用类名group.myList。实例属性是在实例方法中定义的,使用特定类实例的约定self。