Нет, вы не можете. Как следует из другого ответа, вы можете (ab?) Использовать сглаживание изменчивых объектов для достижения аналогичного эффекта. Однако это не то же самое, что ссылки на C ++, и я хочу объяснить, что на самом деле происходит, чтобы избежать каких-либо заблуждений.
Вы видите на C ++ (и других языках) переменную (и поля объекта, и записи в коллекциях и т. д.) - это место хранения, и вы записываете значение (например, целое число, объект или указатель) в это место. В этой модели ссылки являются псевдонимом для места хранения (любого типа) - при назначении переменной без ссылки вы копируете значение (даже если это всего лишь указатель, это все еще значение) для места хранения; когда вы назначаете ссылку, вы копируете в место хранения где-то в другом месте. Обратите внимание, что вы не можете сами изменить ссылку - как только она привязана (и она должна быть как только вы ее создадите), все присваивания к ней изменяют не ссылку, а то, о чем говорится.
В Python (и другие языки), переменная (и поля объекта, и записи в коллекциях и т. д.) - это просто имя. Значения где-то else (например, посыпаны всей кучей), а переменная ссылается (не в смысле ссылок на C ++, скорее как указатель минус арифметика указателя) на значение. Несколько имен могут ссылаться на одно и то же значение (что обычно хорошо). Python (и другие языки) вызывает все, что необходимо, чтобы ссылаться на значение ссылки, несмотря на то, что оно довольно не связано с такими вещами, как ссылки на C ++ и pass-by-reference. Присвоение переменной (или полем объекта или ...) просто означает, что она ссылается на другое значение. Вся модель расположения хранилищ не относится к Python, программист никогда не обрабатывает места хранения для значений. Все, что он хранит и перемешивает, это ссылки на Python, и это не значения в Python, поэтому они не могут быть объектом других ссылок на Python.
Все это не зависит от изменчивости значения - это то же самое для ints и списки, например. Вы не можете взять переменную, которая ссылается и на другую, и перезаписать объект, на который указывает. Вы можете только указать объекту изменить части себя - скажем, изменить содержащуюся в нем ссылку.
Является ли это более ограничительной моделью? Возможно, но это достаточно эффективно в большинстве случаев. И когда это не так, вы можете обойти это, либо с помощью специального класса, подобного приведенному ниже, либо (эквивалентного, но менее очевидного) одноэлементной коллекции.
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
Это все еще выиграло 't позволяет вам псевдоним «регулярной» переменной или поле объекта, но вы можете иметь несколько переменных, относящихся к одному и тому же объекту Reference
(например, для альтернативы mutable-singleton-collection). Вам просто нужно быть осторожным, чтобы всегда использовать .get()
/ .set()
(или [0]
).