ссылки python
К изменяемым объектам в 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.Далее...