这是因为Python解析名称的方式。当您编写self.list时,Python运行时尝试解析列表名称,首先在实例对象中查找它,如果在类实例中没有找到它。
让我们一步一步看看
self.list.append(1)
>对象自身是否有列表名称?
>是的,用吧!完。
>否:转到2。
>对象自身的类实例中是否有列表名称?
>是的,用吧!完
>否:错误!
但是当你绑定一个名字的东西是不同的:
self.list = []
>对象自身是否有列表名称?
>是的,覆盖它!
>否:绑定吧!
所以,这总是一个实例变量。
您的第一个示例在类实例中创建一个列表,因为这是当时的活动范围(不在任何地方)。但是你的第二个例子在self的范围内显式地创建了一个列表。
更有趣的是这个例子:
class testClass():
list = ['foo']
def __init__(self):
self.list = []
self.list.append('thing')
x = testClass()
print x.list
print testClass.list
del x.list
print x.list
这将打印:
['thing']
['foo']
['foo']
删除实例名称的那一刻,通过自引用可以看到类名。