Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 29, 2009 17:25:34

vinchkovsky
От:
Зарегистрирован: 2009-06-08
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение свойства экземпляра класса меняет это свойство у других

Пишу игру на 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'] []
Почему так?



Офлайн

#2 Авг. 29, 2009 20:14:03

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Изменение свойства экземпляра класса меняет это свойство у других

значение c.a нет в последнем списке, а в первом примере указанно не явно ИМХО …. вообще надо тутариал перечитать

Офлайн

#3 Авг. 29, 2009 20:38:59

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Изменение свойства экземпляра класса меняет это свойство у других

Суть проста.

Свойство, обьявленное таким образом, создаётся ещё до того как вы создали экземпляр класса.
То есть такое свойство каждого экземпляра будет ссылаться на один и тот же обьект в памяти.

Оператор += не создаёт новый список. Это тоже самое что и вызывать метод .append(). Таким образом вы изменяете список на который ссылается свойство.
А так как свойства и других экземпляров класса ссылаются на тот же обьект в памяти, то и значение свойства так же изменится.

Просто обьявляйте свойства в конструкторе. И такого не будет происходить, так как при создании каждого экземпляра класса будет создаваться новый список.



Отредактировано (Авг. 29, 2009 20:41:30)

Офлайн

#4 Авг. 29, 2009 20:56:06

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Изменение свойства экземпляра класса меняет это свойство у других

Griffon
согласен :) указание на ячейку памяти происходить не явным способом :) +1 за мнение

Офлайн

#5 Авг. 29, 2009 20:58:39

vinchkovsky
От:
Зарегистрирован: 2009-06-08
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение свойства экземпляра класса меняет это свойство у других

Спасибо за ответы, понятно ;)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version