Форум сайта python.su
Пишу игру на pygame (первый опыт), возник следующий вопрос.
Есть класс:
class A(object):
a = []
def __init__(self):
pass
b = A()
c = A()
b.a += ['a']
print b.a, c.a
['a'] ['a']
b = A()
c = A()
b.a = b.a + ['a']
print b.a, c.a
['a'] []
Офлайн
значение c.a нет в последнем списке, а в первом примере указанно не явно ИМХО …. вообще надо тутариал перечитать
Офлайн
Суть проста.
Свойство, обьявленное таким образом, создаётся ещё до того как вы создали экземпляр класса.
То есть такое свойство каждого экземпляра будет ссылаться на один и тот же обьект в памяти.
Оператор += не создаёт новый список. Это тоже самое что и вызывать метод .append(). Таким образом вы изменяете список на который ссылается свойство.
А так как свойства и других экземпляров класса ссылаются на тот же обьект в памяти, то и значение свойства так же изменится.
Просто обьявляйте свойства в конструкторе. И такого не будет происходить, так как при создании каждого экземпляра класса будет создаваться новый список.
Отредактировано (Авг. 29, 2009 20:41:30)
Офлайн
Griffon
согласен :) указание на ячейку памяти происходить не явным способом :) +1 за мнение
Офлайн
Спасибо за ответы, понятно ;)
Офлайн