类中奇怪的列表行为

时间:2011-11-22 03:11:05

标签: python list

我写了一个列表作为变量的类。我有一个添加到该列表的函数和一个输出该列表的函数。

class MyClass:
    myList = []

    def addToList(self, myNumber):
        self.myList.append(myNumber)

    def outputList(self):
        for someNumber in self.myList:
            print someNumber

现在出于一些奇怪的原因,如果我声明了该类的两个独立对象:

ver1 = MyClass()
ver2 = MyClass()

然后在ver1上调用addToList:

ver1.addToList(3)

然后输出ver2的列表:

ver2.outputList()

我得到3作为版本2列表的输出!发生了什么事?

4 个答案:

答案 0 :(得分:6)

你的语法错了。您正在使用类静态变量。考虑一下:

class MyClass:
    myList = []    # Static variable

    def __init__(self):
        self.myRealList = []   # Member variable

myList实际上是MyClass定义的一部分,因此不仅可以通过类名显示,还可以看到该类的所有实例:

c = MyClass()
c.myList = [1]
print MyClass.myList  # will print [1]

您需要在__init__构造函数中声明常规的“成员变量”。

不要感觉不好,我从C / C ++ / C#世界来到python,犯了同样的错误,一开始也让我很困惑。

答案 1 :(得分:0)

问题是在解析文件时初始化了mylist。因此,MyClass的每个后续初始化都将对同一个mylist具有相同的引用。

class MyClass:
    myList = []

相反,你应该用类初始化它。

class MyClass:
    def __init__(self):
        self.myList = []

答案 2 :(得分:0)

myList实际上是一个类变量(我不知道它是否是Pythonic术语),因为它是在任何函数之外声明的。

要使变量实例 - 本地(再一次,我不知道正确的术语),您应该在 init 方法中初始化它,例如" self.myList = []"

请编辑我的任何错误格式,我在手机上。

答案 3 :(得分:0)

这里有几件事情。你可以在python中拥有实例或类变量。在您的示例中,myList是一个类变量,它在所有实例中都是静态的。还有一些类本地的实例变量,您可以使用实例变量覆盖类变量。这是一个例子:

class Foo:
    bar = 'Hello' # Class variable

    def __init__(self):
        self.foobar = 'Hello World' # instance variable

    def createInstanceBar(self, x):
        self.bar = x # Override class variable and create instance variable

a = Foo()
b = Foo()
print a.bar # Prints Hello
print b.bar # Prints Hello

print a.foobar # Prints Hello World
print b.foobar # Prints Hello World

a.createInstanceBar('Hello New World')
print a.bar # Prints Hello New World
print b.bar # Prints Hello