在代码中:
y = 7
x = y
x = 8现在,y将是7,x将是8,但实际上我想要更改y。我可以赋值y的引用并这样做吗?
例如,在C++中,同样的事情可以实现为:
int y = 8;
int &x = y;
x = 9;现在y和x都将是9
发布于 2012-06-27 17:07:00
不,你不能。正如另一个答案所指出的,您可以(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])即可。
发布于 2012-06-27 16:45:28
不,Python没有这个特性。
如果你有一个列表(或任何其他可变对象),你可以通过改变x和y都绑定到的对象来做你想做的事情:
>>> x = [7]
>>> y = x
>>> y[0] = 8
>>> print x
[8]在线查看它的工作方式:ideone
发布于 2012-06-27 17:05:56
或者,您可以使用自己制作的容器。
class Value(object):
def __init__(self, value): self.value = value
y = Value(7)
x = y
x.value = 8
print y.valuehttps://stackoverflow.com/questions/11222440
复制相似问题