这是因为Python使用解析名称的方式
.。在编写时
self.list,Python运行时首先尝试
list通过在实例对象中查找名称来解析名称,如果找不到,则在类实例中进行查找。
让我们逐步研究它
self.list.append(1)
list
对象中有名称self
吗?- 是的:使用它!完。
- 否:转到2。
list
对象的类实例中是否有名称self
?- 是的:使用它!完
- 否:错误!
但是当您绑定名称时,情况有所不同:
self.list = []
list
对象中有名称self
吗?- 是:覆盖它!
- 否:绑定!
因此,这始终是一个实例变量。
您的第一个示例
list在类实例中创建了一个,因为这是当时的活动范围(没有
self任何地方)。但是您的第二个示例
list在的范围内显式创建了一个
self。
这个例子更有趣:
class testClass(): list = ['foo'] def __init__(self): self.list = [] self.list.append('thing')x = testClass()print x.listprint testClass.listdel x.listprint x.list那将打印:
['thing']['foo']['foo']
删除实例名称后,可以通过
self引用看到类名称。



