如何创建对变量的引用?
在代码中:
y = 7
x = y
x = 8
现在,y
将是7,x将是8。但是实际上,我想改变y
。我可以分配引用y
吗?
例如,在C ++中,可以达到以下目的:
int y = 8;
int &x = y;
x = 9;
现在,这两个y
&x
将是9
-
你不能。正如其他答案指出的那样,您可以(ab?)使用可变对象的别名来达到类似的效果。但是,这与C
++参考不是同一回事,我想解释一下为避免误解而实际发生的情况。您会看到,在C
++(和其他语言)中,变量(以及对象字段以及集合中的条目等)是存储位置,并且您在其中写入了一个值(例如,整数,对象或指针)该位置。在这种模型中,引用是存储位置(任何类型)的别名-
分配给非引用变量时,您将一个值(即使只是指针,它仍然是一个值)复制到该存储位置;分配给参考时,您将复制到其他位置的存储位置。请注意,您无法更改引用本身-
绑定引用后(必须在创建一个引用后立即更改),对其的所有分配都不会更改引用,而是会更改引用的内容。在Python(和其他语言)中,变量(以及对象字段以及集合中的条目等)只是一个名称。价值观在 某处 否则(例如散布在整个堆上),并且变量将值(不是C
引用的意义,更像是指针减去指针算术)引用。多个名称可以引用相同的值(通常是一件好事)。尽管与C
引用和传递引用无关,Python(和其他语言)还是将引用值所需的任何内容称为引用。分配给变量(或对象字段或…)只是使其引用另一个值。整个存储位置模型不适用于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
对象(同为mutable-singleton-collection替代项)。您只需要注意始终使用.get()
/.set()
(或[0]
)即可。