Ссылки на изменяемые объекты долго живут
К изменяемым объектам в Python относятся списки, словари и объекты наследуемые от базового класса object. Будьте крайне внимательны при написании программ, помните что связь на изменяемый объект сохраняется всегда.
class M(object):
def __init__(self, data):
self.__data = data
def data(self):
return self.__data
init_data = ['php']
m = M(init_data)
print m.data() # ['php']
init_data.append('python')
# объекты init_data и M.__data ссылаются на один и тот же объект
print init_data # ['php', 'python']
print m.data() # ['php', 'python']
data = m.data()
print data # ['php', 'python']
data.append('ruby')
# теперь уже 3 объекта ссылаются на одну и ту же переменную
print data # ['php', 'python', 'ruby']
print init_data # ['php', 'python', 'ruby']
print m.data() # ['php', 'python', 'ruby']
На самом деле даже если вы отправляете объект в функцию, связь не теряется на выходе. Функция возвращает ссылку на переменную.
M = lambda data: data
init_data = ['php']
m = M(init_data)
m.append('python')
print m # ['php', 'python']
print init_data # ['php', 'python']
print m is init_data # True
Будьте внимательны при написании программ, иногда необходимо чтобы метод класса или функция вернули новый объект, а не ссылку. Создать новый объект например из списка можно - list(lst), из словаря dict(). В остальных случаях поможет модуль copy.
В бизнесе важную роль играют знания, готовые фирмы не могут долго существовать если ею управляет неопытный игрок в этом деле. Обращение за юридической помощи может спаси Ваш бизнес, главное вовремя начать решение возникнувших проблем.
