Python类成员表现得好像是静态的?

时间:2012-09-16 06:33:21

标签: python list

我正在编写我的第一个python程序,而且我遇到了一些看起来很奇怪的东西。

我的程序如下:

def main():
  listOfThings = []
  for i in range(0,3):
    newThing = thing()
    newThing.listOfStrings.append('newString')
    listOfThings.append(newThing)

事情看起来像这样:

class thing:
  listOfStrings = []

我期待listOfThings为:

listOfThings
 -thing1
  -newString
 -thing2
  -newString
 -thing3
  -newString

但我得到了这个:

listOfThings
 -thing1
  -newString
  -newString
  -newString
 -thing2
  -newString
  -newString
  -newString
 -thing3
  -newString
  -newString
  -newString

在其他语言中,如果thing.listOfStrings是静态的,这就是我期望看到的。我在这里缺少一些微妙的python吗?

2 个答案:

答案 0 :(得分:4)

listOfStrings是一个类属性。所有实例都将共享相同的list

相反,您应该在__init__

期间添加该属性
class thing:
    def __init__(self):
        self.listOfStrings = []

答案 1 :(得分:4)

在Python中,在类范围内声明的任何“变量”都变成类属性,它们类似于其他语言中的静态类成员。可以通过类名thing.listOfStrings或实例newThing.listOfStrings访问它们,但它们始终引用相同的属性。

如果您想要实例属性,请使用__init__方法创建它们:

class Thing:
    def __init__(self):
        self.listOfStrings = []

每次使用Thing实例化Thing()的新实例时,__init__都会在新实例中运行,并为其提供自己的listOfStrings列表。

请注意,由于Python的动态特性,__init__不是唯一可以添加实例属性的地方(尽管它是推荐的位置)。例如,以下是合法的:

class Foo:
    pass # empty class definition

a = Foo()
a.x = 42
print a.x # prints 42

b = Foo()
b.y = 99
print b.x # raises AttributeError
print b.y # prints 99