我正在尝试用 Python 完成一些事情,但我在互联网上根本找不到这方面的信息,所以这是我的问题。
有这个示例代码:
a = 5
b = [a]
我需要 b[0] 作为对 a 的指针引用。目前如果我这样做
b[0] = 7
a.var 仍然是 5,如果我将 value 设置为 a b[0],a 保持不变。
我想知道在 Python 中是否有任何方法可以在不复制对象的情况下将对象存储在数组中,因此如果我修改一个对象,我也会修改另一个对象。
编辑一个
我想更好地阐明我正在努力完成的事情,这样也许我可以找到真正的答案。
我有一个自定义类
class Foo(object):
def __init__(self):
self.var = 7
我也有一个这样的列表:
myList = [Foo()]
我真正的问题是:
在一段代码的某个地方,我需要做如下赋值:
self.foo = myList[0]
然后,当我尝试访问这个 foo var 时,我注意到它从未从原始实例更新。所以基本上这就是我需要的。
编辑二
所有答案都是正确的。在我的作业的每一步使用 id(var) 我可以验证对象一直是相同的,所以错误一定是在其他地方。感谢大家提供的所有帮助,我希望这篇文章将来能对其他人有所帮助。
请您参考如下方法:
您已经在存储对象,即整数 5。您没有存储的是名称 a 和值 5 之间的名称-值绑定(bind)。您的问题是操作 b[0] = 7 没有修改对象 5;它只修改 b[0] 和它的值(从 5 到 7)之间的绑定(bind),而保持值本身(5 和 7)不变。事实上,您不能修改值 5,因为 5 是一个整数,而 Python 中的整数是不可变的。
另一种说法是 b[0] = 7 不会修改 b[0] 引用的对象;相反,它修改了 b 引用的对象。 b 是一个列表,列表是在内部跟踪其索引指向的对象的对象。当您执行 b[0] = 7 时,这会告诉 b“让您的 0 索引指向这个新对象”。它不会“通知”5(旧值)或 7(新值)它们现在由 b[0] 指向。 Python 中的对象不知道指向它们的引用类型;他们只知道他们指的是什么(如果有的话)。
您要求的不是存储对象的方法,而是存储“变量”的方法——即本地 namespace 中的名称与值之间的绑定(bind)。答案是,一般来说,在 Python 中没有办法做到这一点。没有允许您执行 b = something(a) 的构造,因此当您稍后执行 b[0] = 8 时,a 会改变。
如果你想修改名称-值绑定(bind),你需要改变a,使它成为某种内容可以改变的对象,而不是仅仅使它成为一个普通的对象多变的。例如,如果您这样做:
a = [5]
b = a
b[0] = 7
然后你会发现a也变了。其他类型的对象也是如此:如果将 a 设置为其他类型的对象,其属性可以更改,然后就地更改其属性,这些更改将显示无论您如何引用对象。
您可能会发现阅读 Python 变量的工作原理很有帮助,例如 this article和 this one .
