这与here中讨论的问题基本相同。
令人惊讶吗?当您定义类时,Python 解释器执行类字段。然后,如果您创建类的新实例,则不会执行类字段。因此类字段仅在您定义类时执行一次。喜欢:
class someClass:
someVar = 0 #<---This class field is executed once
def __init__(self):
pass
好的。现在你定义了类。接下来,您创建该类的新实例。喜欢:
instance1 = someClass()
instance2 = someClass()
这将创建新内存并从someClass 复制数据。
现在instance1 和instance2 不共享内存空间。他们有自己独立的内存空间。所以instance1.someVar 和instance2.someVar 有不同的内存空间。但是instance1.someVar 中的0 和instance2.someVar 中的0 是完全相同的对象(0 在相同的内存空间上)。你可以确保它这样做:
print id(instance1.someVar)==id(instance2.someVar)
所以你可以发现0 是完全一样的对象。
someClass.someVar = 0 不是唯一的情况。当您使用 [] 替换 0 时,也会发生同样的事情。
回到您的代码。您可以像这样简单地出现问题:
class test:
group = []
def __init__(self,name):
self.name = str(name)
test0 = test(0)
test1 = test(1)
test0.group.append(100)
print test0.group
print test1.group
#[100]
#[100]
#will be printed
这是因为test0.group 和test1.group 指向同一个对象。喜欢:
+-----------+
|test0.group|------+
+-----------+ |
v
+-------+
| [] |
+-------+
^
+-----------+ |
|test1.group|------+
+-----------+
当你执行test0.group.append(100)时,它变成了:
+-----------+
|test0.group|------+
+-----------+ |
v
+-------+
| [100] |
+-------+
^
+-----------+ |
|test1.group|------+
+-----------+
您也可以设置另一个对象。喜欢:
test1.group = "123"
然后test1.group 变成:
+-----------+
|test0.group|------+
+-----------+ |
v
+-------+
| [100] |
+-------+
+-----------+ +-----+
|test1.group|------>|"123"|
+-----------+ +-----+
对不起,我的英语不好。我希望它有所帮助。 :)