Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.254.94] |
|
Сообщ.
#1
,
|
|
|
class test: abc = {'a': 1} def __init__(self): self.func(self.abc) print self.abc def func(self, var): new = var new['a'] = 222 test() распечатает "222", я не понимаю, почему она изменяется??! |
Сообщ.
#2
,
|
|
|
Происходит примерно следующее:
В строке 5 вызывая функцию func вы пытаетесь передать туда переменную экземпляра self.abc, но у объекта экземпляра её нет. Тогда интерпретатор идёт в объект класса который порождает данный объект экземпляра и находит его там. В функцию func передаётся ссылка на объект словаря который находится в объекте класса. Далее в строке 9 происходит копирование ссылки на словарь в переменную new. Строка 9 - изменение объекта словаря который в объекте класса. Строка 6 - попытка найти переменную abc в объекте экземпляра, неудача и поиск этой переменной в объекте класса, где она уже изменилась. Вот как то так в 2-х словах, если я ничего не напутал |
Сообщ.
#3
,
|
|
|
Потому что переменная - это ссылка на мутабельный объект (словари, списки). При присвоении ссылки появляется не копия объекта, а еще одна ссылка на него:
L = [0] M = L M[0] = 1 print L # выдаст [1] Используй self.abc = test.abc.copy() (для словарей), [:] для списков |
Сообщ.
#4
,
|
|
|
Мяут-Настоящий
Спасибо, нашел описание этого в документации. Оказалось очень неожиданно, что мутабельные объекты он передает по ссылке |