На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > [Python] переменная изменяется глобально
      ExpandedWrap disabled
        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", я не понимаю, почему она изменяется??!
        Происходит примерно следующее:
        В строке 5 вызывая функцию func вы пытаетесь передать туда переменную экземпляра self.abc, но у объекта экземпляра её нет. Тогда интерпретатор идёт в объект класса который порождает данный объект экземпляра и находит его там. В функцию func передаётся ссылка на объект словаря который находится в объекте класса. Далее в строке 9 происходит копирование ссылки на словарь в переменную new. Строка 9 - изменение объекта словаря который в объекте класса. Строка 6 - попытка найти переменную abc в объекте экземпляра, неудача и поиск этой переменной в объекте класса, где она уже изменилась. Вот как то так в 2-х словах, если я ничего не напутал
          Потому что переменная - это ссылка на мутабельный объект (словари, списки). При присвоении ссылки появляется не копия объекта, а еще одна ссылка на него:
          ExpandedWrap disabled
            L = [0]
            M = L
            M[0] = 1
             
            print L # выдаст [1]


          Используй self.abc = test.abc.copy() (для словарей), [:] для списков :)
          Сообщение отредактировано: Мяут-Настоящий -
            Мяут-Настоящий
            Спасибо, нашел описание этого в документации. Оказалось очень неожиданно, что мутабельные объекты он передает по ссылке
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0209 ]   [ 15 queries used ]   [ Generated: 3.05.24, 19:24 GMT ]