繁体   English   中英

课堂上的怪异行为

[英]Weird list behavior in class

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

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列表的输出! 怎么了?

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

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的,犯了同样的错误,一开始它也使我感到困惑。

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

class MyClass:
    myList = []

相反,您应该使用该类对其进行初始化。

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

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

若要使局部变量成为实例(再一次,我不知道合适的术语),则应在init方法中将其初始化,例如“ self.myList = []”。

我正在用手机编辑任何格式错误的文件。

这里发生了几件事。 您可以在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM