我正在编写我的第一个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吗?
答案 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