Домой

Последняя активность

  

Ссылки на изменяемые объекты долго живут Python

PyDeKolt avatar PyDeKolt (0) [#] (27.05.2013 / 17:00)
К изменяемым объектам в Python относятся списки, словари и объекты наследуемые от базового класса object. Будьте крайне внимательны при написании программ, помните что связь на изменяемый объект сохраняется всегда.
  1. class M(object):
  2. def __init__(self, data):
  3. self.__data = data
  4. def data(self):
  5. return self.__data
  6. init_data = ['php']
  7. m = M(init_data)
  8. print m.data() # ['php']
  9. init_data.append('python')
  10. # объекты init_data и M.__data ссылаются на один и тот же объект
  11. print init_data # ['php', 'python']
  12. print m.data() # ['php', 'python']
  13. data = m.data()
  14. print data # ['php', 'python']
  15. data.append('ruby')
  16. # теперь уже 3 объекта ссылаются на одну и ту же переменную
  17. print data # ['php', 'python', 'ruby']
  18. print init_data # ['php', 'python', 'ruby']
  19. print m.data() # ['php', 'python', 'ruby']

На самом деле даже если вы отправляете объект в функцию, связь не теряется на выходе. Функция возвращает ссылку на переменную.
  1. M = lambda data: data
  2. init_data = ['php']
  3. m = M(init_data)
  4. m.append('python')
  5. print m # ['php', 'python']
  6. print init_data # ['php', 'python']
  7. print m is init_data # True

Будьте внимательны при написании программ, иногда необходимо чтобы метод класса или функция вернули новый объект, а не ссылку. Создать новый объект например из списка можно - list(lst), из словаря dict(). В остальных случаях поможет модуль copy.
- Ссылки в Python
* Курсы Python
  Всего: 1

Зарегистрируйтесь и сможете комментировать все темы. Кнопочка вверху
Фильтр по автору
Скачать тему

В Форум

Новые вверху
Statok.net Рейтинг@Mail.ru
spywap.nettop-sid.ru
Яндекс.Метрика