【发布时间】:2011-09-30 06:14:06
【问题描述】:
这个脚本:
class testa():
a = []
class testb():
def __init__(self):
self.a = []
ta1 = testa(); ta1.a.append(1); ta2 = testa(); ta2.a.append(2)
tb1 = testb(); tb1.a.append(1); tb2 = testb(); tb2.a.append(2)
print ta1.a, ta2.a, tb1.a, tb2.a
产生这个输出:
[1, 2] [1, 2] [1] [2]
但我期待
[1] [2] [1] [2]
为什么我错了? testa 和 testb 的定义似乎和我是等价的,那为什么行为会发生如此巨大的变化?!
编辑: 这似乎不直观,因为它与其他类型(如 int 和 str)的行为方式不同。由于某些原因,列表在 init 中未初始化时被创建为类变量,但无论如何 int 和 strs 都被创建为对象变量。
【问题讨论】:
-
字符串、整数和列表之间的区别在于列表是可变的,而字符串和整数是不可变的。您不能更改字符串的值。您可以绑定到不同的字符串。
-
字符串和整数也被创建为类变量。只是你不能在 int 上调用
append,你必须用赋值重新绑定它。这会创建一个 new int 对象作为实例变量(除非您在类上重新绑定它),并让类变量隐藏(对于该特定实例)但保持不变。 -
似乎我们最近已经得到了这个问题的几十个变体......