Назначение ссылки на переменную Python

В коде

y = 7
x = y    
x = 8

Теперь у будет 7 и х будет 8. Но на самом деле я хочу изменить у. Могу ли я присвоить ссылку y и сделать это?

Например, в C ++ может быть достигнуто то же самое, что и

int y = 8;
int &x = y;
x = 9;

Теперь и у & amp; х будет 9

Ответы на вопрос(4)

class Value(object):
    def __init__(self, value): self.value = value

y = Value(7)
x = y
x.value = 8
print y.value

ideone

В питонеx & Амп;y это просто ссылки на объекты такy = 7 означает, что у указывает на объект7. x=y средстваx тоже указывает на7, но, как7 является неизменным, поэтому изменение значения х просто меняет объект7 а такжеy по-прежнему указывает на7.

>>> y = [7]
>>> x = y
>>> x[0] = 8 # here you're changing [7] not x or y, x & y are just references to [7]
>>> y
[8]
 07 сент. 2017 г., 10:10
Вы хотели указать, что у остается неизменным даже после изменения х, но это не то, что вы здесь написали. Просьба уточнить.

Если бы у вас был список (или любой другой изменяемый объект), вы могли бы делать то, что вы хотите, изменяя объект, с которым связаны оба x и y:

>>> x = [7]
>>> y = x
>>> y[0] = 8
>>> print x
[8]

Посмотрите, как работает онлайн:ideone

 24 сент. 2013 г., 21:34
Хотя это действительно полезно, в этой «мутации» есть более или менее большой недостаток. одного простого числового значения. Превращение целого числа в списке с одним элементом требует чуть более чем в 3 раза большего объема памяти, чем обычно требуется. Пример (я буду использовать sys.getsizeof (...) для иллюстрации разницы в размерах): x = 1 - & gt; sys.getsizeof (x) - & gt; дайте нам 14 - & gt; x = [1] - & gt; sys.getsizeof (x) - & gt; дает нам 36
Решение Вопроса

ты не можешь. Как указывают другие ответы, вы можете (ab?) Использовать псевдонимы изменяемых объектов для достижения аналогичного эффекта. Однако это не то же самое, что ссылки на C ++, и я хочу объяснить, что на самом деле происходит, чтобы избежать каких-либо заблуждений.

Вы видите, что в C ++ (и других языках) переменная (и поля объекта, и записи в коллекциях и т. Д.) Является местом хранения, и вы записываете значение (например, целое число, объект или указатель) в это место. В этой модели ссылки представляют собой псевдоним для места хранения (любого типа) - когда вы присваиваете не ссылочной переменной, вы копируете значение (даже если оно просто указатель, оно все еще значение) в место хранения; когда вы присваиваете ссылку, вы копируете ее в другое место. Обратите внимание, что вы не можете изменить саму ссылку - как только она связана (и должна это сделать, как только вы ее создадите), все присвоения ей изменяют не ссылку, а то, на что она ссылается.

В Python (и других языках) переменная (и поля объекта, и записи в коллекциях и т. Д.) - это просто имя. Значенияsomewhere else (например, разбросанный по всей куче), и переменная ссылается (не в смысле ссылок C ++, скорее как указатель минус арифметика указателя) на значение. Несколько имен могут ссылаться на одно и то же значение (что, как правило, хорошо). Python (и другие языки) вызывает все, что необходимо для ссылки на значение как ссылку, несмотря на то, что он довольно не связан с такими вещами, как ссылки C ++ и передача по ссылке. Присвоение переменной (или объектному полю, или ...) просто заставляет ее ссылаться на другое значение. Вся модель мест хранения не применима к Python, программист никогда не обрабатывает места хранения значений. Все, что он хранит и перемешивает, это ссылки на Python, и они не являются значениями в Python, поэтому они не могут быть целью других ссылок Python.

Все это не зависит от изменчивости значения, например, одинаково для целых чисел и списков. Вы не можете взять переменную, которая ссылается на любую из них, и перезаписать объект, на который она указывает. Вы можете только сказать объекту изменить части себя - скажем, изменить некоторые ссылки, которые он содержит.

Это более ограничительная модель? Возможно, но в большинстве случаев он достаточно мощный. И когда это не так, вы можете обойти это либо с помощью пользовательского класса, подобного приведенному ниже, либо (эквивалентного, но менее очевидного) набора из одного элемента.

class Reference:
    def __init__(self, val):
        self._value = val # just refers to val, no copy

    def get(self):
        return self._value

    def set(self, val):
        self._value = val

Это по-прежнему не позволит вам использовать псевдоним "обычный" переменная или поле объекта, но вы можете иметь несколько переменных, ссылающихся на одну и ту жеReference объект (то же самое для альтернативы изменяемой-синглтон-коллекции). Вы просто должны быть осторожны, чтобы всегда использовать.get()/.set() (или же[0]).

 27 июн. 2012 г., 11:20
Хорошее объяснение, +1 за разъяснение, что это не имеет ничего общего с изменчивостью.

Ваш ответ на вопрос