4

我想有一个引用,读作“名称'x'指向的任何变量”与整数,以便它的行为如下:

>>> a = 1
>>> b = 2
>>> c = (a, b)
>>> c
(1, 2)
>>> a = 3
>>> c
(3, 2)

我知道我可以通过以下方式对列表做类似的事情:

>>> a = [1]
>>> b = [2]
>>> c = (a, b)
>>> c
([1], [2])
>>> a[0] = 3
>>> c
([3], [2])

但是如果将ab分配给某物而不是它们的元素,这很容易丢失。

有没有一种简单的方法可以做到这一点?

4

6 回答 6

4

不,在 Python 中没有直接的方法可以做到这一点。原因是标量值(数字)和元组都是不可变的。一旦您建立了从名称到不可变值的绑定(例如c带有 tuple的名称(1, 2)),除了重新分配之外,您所做的任何事情都c无法更改它所绑定的值。

请注意,在您的第二个示例中,尽管元组本身是不可变的,但它包含对可变值的引用。所以看起来好像元组发生了变化,但元组的身份保持不变,只有可变部分在变化。

于 2010-10-03T22:33:03.387 回答
2

无论您提出倒数第二行的任何可能解决方案,都将始终破坏它:

a = 3

这将为变量分配一个全新的内容。除非a代表对象或某物的属性(或列表中的键,就像您在自己的示例中所做的那样),否则您将无法在 first 和 last 之间建立关系a

于 2010-10-03T22:37:56.400 回答
2

如果您只需要将当前值动态放置在元组中,则可以使用 lambda。您必须调用 c,而不仅仅是返回或使用它,但这在您的情况下可能是可以接受的。像这样的东西:

>>> a = 1
>>> b = 2
>>> c = lambda: (a, b)
>>> c()
(1, 2)
>>> a = 3
>>> c()
(3, 2)
于 2010-10-04T03:39:30.290 回答
1

Python 中没有办法,不仅因为数字是不可变的,还因为你没有指针。将值包装在列表中模拟您拥有指针,因此这是您能做的最好的事情。

于 2010-10-03T23:41:38.480 回答
1
class ByRefValue(object):
    def __init__(self, value):
        self.value = value

将它传递到任何你喜欢的地方,记住你需要访问value成员而不是整个对象。


或者,如果它在全局命名空间中,globals().get('a', 0)则返回值(a如果不在,则返回零)。


最后:

import threading
tls = threading.local()

tls.a = 1

如果您导入tls到您需要它的每个模块中,您将a 在每个线程上访问相同的值。根据程序的设置方式,这可能是可接受的、理想的或无用的。

于 2010-10-04T03:49:14.410 回答
0

您可以尝试创建自己的指针类和自己的指针存储对象来模拟系统的内部堆栈。

于 2010-10-04T03:21:43.463 回答