Это из-за способа, которым 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.list
print testClass.list
del x.list
print x.list
, который напечатает:
['thing']
['foo']
['foo']
В тот момент, когда вы удаляете имя экземпляра, имя класса отображается через ссылку self
.