vinchkovsky
Авг. 29, 2009 17:25:34
Пишу игру на pygame (первый опыт), возник следующий вопрос.
Есть класс:
class A(object):
a = []
def __init__(self):
pass
Если так:
b = A()
c = A()
b.a += ['a']
print b.a, c.a
То вижн это:
А если так:
b = A()
c = A()
b.a = b.a + ['a']
print b.a, c.a
То результат таков:
Почему так?
sypper-pit
Авг. 29, 2009 20:14:03
значение c.a нет в последнем списке, а в первом примере указанно не явно ИМХО …. вообще надо тутариал перечитать
Griffon
Авг. 29, 2009 20:38:59
Суть проста.
Свойство, обьявленное таким образом, создаётся ещё до того как вы создали экземпляр класса.
То есть такое свойство каждого экземпляра будет ссылаться на один и тот же обьект в памяти.
Оператор += не создаёт новый список. Это тоже самое что и вызывать метод .append(). Таким образом вы изменяете список на который ссылается свойство.
А так как свойства и других экземпляров класса ссылаются на тот же обьект в памяти, то и значение свойства так же изменится.
Просто обьявляйте свойства в конструкторе. И такого не будет происходить, так как при создании каждого экземпляра класса будет создаваться новый список.
sypper-pit
Авг. 29, 2009 20:56:06
Griffon
согласен :) указание на ячейку памяти происходить не явным способом :) +1 за мнение
vinchkovsky
Авг. 29, 2009 20:58:39
Спасибо за ответы, понятно ;)