3

我似乎无法理解这里发生了什么:

class testclass: 

    def __init__(self): 
        print "new instance" 
    myList=[] 

if __name__ == "__main__":  

    inst1=testclass() 
    inst1.myList.append("wrong") 

    inst2=testclass() 
    inst2.myList.append("behaviour") 

    print "I get the",inst2.myList

输出是:

new instance
new instance
I get the ['wrong', 'behaviour']

我原以为 inst1 中的列表对 inst2 中的列表一无所知但不知何故, myList的范围似乎超越了类的实例化。我觉得这非常令人不安和令人费解,还是我在这里遗漏了什么?

谢谢!

4

6 回答 6

6

您定义的方式myList是类属性。

您正在寻找的行为是对象属性之一:

class testclass:
    def __init__(self): 
        print "new instance"
        self.myList = []

让我们尝试一下:

>>> t1 = testclass()
new instance
>>> t2 = testclass()
new instance
>>> t1.myList.append(1)
>>> t2.myList.append(2)
>>> t1.myList
[1]
>>> t2.myList
[2]

如果您对类属性感兴趣,请查看类文档。由于 Python 中的类也是对象,就像(几乎)Python 中的所有东西一样,它们可以有自己的属性。

于 2012-02-22T12:11:22.393 回答
3

您在类中声明的方式myList使其成为属性。如果您打算拥有一个实例属性,请像这样声明它,它将具有预期的行为:

class testclass:
    def __init__(self): 
        print "new instance" 
        self.myList=[]
于 2012-02-22T12:10:28.853 回答
1

是的,因为这就是类属性的用途。如果你想要一个实例变量,你需要在实例本身上声明它——通常self在方法内部。

于 2012-02-22T12:10:49.880 回答
1

myList实例化时初始化,因为它是在类的主体中声明的,而不是在对象实例化时。

然后与实例共享这些属性,直到在实例上创建同名的变量。

因此,在您的情况下,您正在使用每个对象来访问同一个myList对象(并向其附加一个值)。

于 2012-02-22T12:13:07.573 回答
0
class testclass:

    def __init__(self):
        self.myList=[]
        print "new instance"
于 2012-02-22T12:11:23.593 回答
0

如果您希望 myList 成为实例变量,则应在 init 函数中定义 self.myList 。然后你应该得到你期望的行为。正如您现在所拥有的,我认为 myList 是一个类变量,并且将由该类的所有实例共享。

于 2012-02-22T12:15:01.177 回答