如何创建对变量的引用?

发布于 2021-01-29 17:58:24

在代码中:

y = 7
x = y
x = 8

现在,y将是7,x将是8。但是实际上,我想改变y。我可以分配引用y吗?

例如,在C ++中,可以达到以下目的:

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

现在,这两个yx将是9

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    你不能。正如其他答案指出的那样,您可以(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])即可。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看