Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建对变量的引用?_Python_Reference - Fatal编程技术网

Python 如何创建对变量的引用?

Python 如何创建对变量的引用?,python,reference,Python,Reference,在守则中: y = 7 x = y x = 8 现在,y将是7,x将是8。但实际上我想改变y。我可以分配y的引用并执行此操作吗 例如,在C++中,同样的事情可以实现为: inty=8; int&x=y; x=9; 现在y和x都将是9不,Python没有这个功能 如果您有一个列表(或任何其他可变对象),您可以通过改变x和y都绑定到的对象来执行您想要的操作: >>> x = [7] >>> y = x >>> y[0] = 8 >>

在守则中:

y = 7
x = y
x = 8
现在,
y
将是7,x将是8。但实际上我想改变
y
。我可以分配
y
的引用并执行此操作吗

例如,在C++中,同样的事情可以实现为:

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

现在
y
x
都将是9

不,Python没有这个功能

如果您有一个列表(或任何其他可变对象),您可以通过改变x和y都绑定到的对象来执行您想要的操作:

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

联机查看它的工作情况:

您应该为此使用可变对象

在python中,
x
&
y
只是对对象的引用 因此
y=7
意味着y指向对象
7
x=y
表示
x
也指向
7
,但由于
7
是不可变的,因此更改x的值只会更改对象
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]

或者,您可以使用自行编制的容器

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

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

不,你不能。正如其他答案所指出的,您可以(ab?)使用可变对象的别名来实现类似的效果。然而,这与C++引用不一样,我想解释一下实际上避免了任何误解。

<>你可以看到,在C++(和其他语言)中,变量(和对象字段,以及集合中的条目等)是一个存储位置,并且你可以将一个值(例如,一个整数、一个对象或一个指针)写入那个位置。在这个模型中,引用是存储位置(任何类型)的别名-当您分配给非引用变量时,您将一个值(即使它只是一个指针,它仍然是一个值)复制到存储位置;分配给引用时,将复制到其他位置的存储位置。请注意,您不能更改引用本身-一旦它被绑定(并且必须在您创建一个引用后立即更改),对它的所有赋值都不会更改引用,而是更改引用的内容

在Python(和其他语言)中,变量(以及对象字段和集合中的条目等)只是一个名称。值在其他地方(例如,堆堆上到处都是),而变量引用(不在C++引用的意义上,更像指针减去指针算术)到一个值。多个名称可以引用同一个值(这通常是一件好事)。Python(和其他语言)调用引用引用值所需的任何内容,尽管与C++引用和传递引用无关。分配给变量(或对象字段,或…)只会使其引用另一个值。整个存储位置模型不适用于Python,程序员从不处理值的存储位置。他所有的存储和移动都是Python引用,而这些不是Python中的值,所以它们不能成为其他Python引用的目标

所有这些都与值的可变性无关——例如,int和list也是如此。不能接受引用其中一个的变量,并覆盖它所指向的对象。您只能告诉对象修改其自身的一部分,例如,更改其包含的某些引用

这是一种限制性更强的模式吗?也许吧,但大多数时候它都足够强大。如果不是,您可以使用如下所示的自定义类或(等效但不太明显的)单个元素集合来解决它

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]
)。

很好的解释,+1澄清它与可变性无关。虽然这确实很有帮助,但单个简单数值的“变异”或多或少有很大的缺点。使用单个元素在列表中转换整数所需的内存空间仅为通常需要的内存空间的3倍多一点。示例(我将使用sys.getsizeof(…)来说明大小的差异):x=1->sys.getsizeof(x)->give-us 14->x=[1]->sys.getsizeof(x)->给我们提供36您想指出的是,即使在更改x之后,y仍然保持不变,但这不是您在这里写的内容。请澄清。