Какова адекватная альтернатива передаче по ссылке в Python?

В Python, как известно, работа с переменными отличается от того же C. Существует ли хоть какая-нибудь возможность сделать, грубо говоря, ссылку на переменную, содержащую иммутабельный объект? Или только оборачивать его в мутабельный и ссылаться на него?

Приведу пример для наглядности. Допустим, реализовываем двоичное дерево. Это можно сделать по-разному, но код взят такой, чтобы подходил под вопрос. Так что претензии вроде «Так никто не реализует двоичные деревья» не принимаются. В конструкторе имеем:
self.left = None
self.right = None

И если я захочу получить ссылку на одно из свойств (для добавления или поиска элемента) во избежание дублирования кода, то у меня ничего не выйдет:
branch = self.left if condition else self.right

Если мы branch присвоим какое-то значение, исходный объект это не затронет.

Будем считать, что иметь None на данном этапе там обязательно.

Можно, как уже писал выше, обернуть все это в мутабельный объект. Например, список, и работать с нулевым его элементом. Или специальный класс завести.

Можно обойти проблему, работая с ключами списка/словаря:
self.branches=[None, None]
...
branch = 0 if condition else 1
и обращаться к branches[branch].

Но если вдруг очень хочется решить задачу на основе первого примера, выкрутиться и нормально сослаться на self.left / self.right совсем никак нельзя? Только расписывать в ветках условного оператора одни и те же действия для разных ветвей?
  • Вопрос задан
  • 2671 просмотр
Решения вопроса 1
yttrium
@yttrium
Похоже кто-то из нас двоих запутался. и в обоих случаях виноваты вы.
при branch = self.left if condition else self.right в branch помещается как раз таки ссылка.
А тот монёвр который хотите воспроизвести вы, чесно говоря не видел в других языках.
Ещё важный момент который нужно понять, это то что в питоне нет переменных, есть имена. локальные, глобальные. и все они ссылаются на какой-то объект.
А по этому необходим применить другой подход. возможно понравится вариант когда в condition лежит либо "left" либо "right". тогда читаем через getattr(self, condition) и пишем через setattr(self, condition, value)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы