Ait*_*lez 1 python reference list object
我正在尝试用Python完成一些事情,但我无法在互联网上找到关于此的信息,所以这是我的问题.
有这个示例代码:
a = 5
b = [a]
Run Code Online (Sandbox Code Playgroud)
我需要b [0]作为a的指针引用.目前,如果我这样做
b[0] = 7
Run Code Online (Sandbox Code Playgroud)
a.var仍然是5,如果我将值设置为ab [0],则a保持不变.
我想知道在Python中是否有任何方法可以将Object存储在数组中而不复制它,所以如果我修改了一个,我也会修改另一个.
编辑一个
我想更清楚地说明我想要完成的事情,所以也许我能找到真正的答案.
我有一个自定义类
class Foo(object):
def __init__(self):
self.var = 7
Run Code Online (Sandbox Code Playgroud)
我还有一个这样的列表:
myList = [Foo()]
Run Code Online (Sandbox Code Playgroud)
我真正的问题是:
在代码的某个地方,我需要做以下任务:
self.foo = myList[0]
Run Code Online (Sandbox Code Playgroud)
然后当我尝试访问这个foo var时,我注意到它从未从原始实例更新.所以基本上这就是我需要的.
编辑二
所有答案都是对的.在我的赋值的每一步使用id(var)我可以验证Object始终是相同的,因此错误必须在其他地方.感谢所有人的帮助,我希望这篇文章可以帮助其他人.
你已经被存储的对象,即整数5.你所不存储的名称是值的名称之间的结合a
和值5
.你的问题是操作b[0] = 7
不会修改对象5
; 它只修改了它b[0]
和它的值之间的绑定(从5到7),保持值本身(5和7)不受影响.实际上,你不能修改值5,因为5是一个整数,Python中的整数是不可变的.
另一种说法是b[0] = 7
不修改所引用的对象b[0]
; 相反,它修改了引用的对象b
. b
是一个列表,列表是内部跟踪其索引指向的对象的对象.当你这样做时b[0] = 7
,这告诉b
"让你的0索引点在这个新对象".它不会"通知"它们现在指向的5(旧值)或7(新值)b[0]
.Python中的对象不知道哪种引用指向它们; 他们只知道他们指的是什么(如果有的话).
你要求的不是存储对象的方法,而是存储"变量"---即本地命名空间中的名称与值之间的绑定.答案是,通常没有一种方法可以在Python中执行此操作.没有任何构造可以让你这样b = something(a)
做,以后当你做b[0] = 8
,一个会改变.
如果您希望能够修改名称 - 值绑定,则需要a
通过使其成为某种可以更改其内容的对象来进行更改,而不是仅仅将其设置为普通变量.例如,如果你这样做:
a = [5]
b = a
b[0] = 7
Run Code Online (Sandbox Code Playgroud)
然后你会发现a
也发生了变化.对于其他类型的对象也是如此:如果设置a
为其属性可以更改的其他类型的对象,然后您就地更改其属性,无论您如何引用该对象,这些更改都将显示.
您可能会发现阅读Python变量的工作方式很有帮助,例如本文和本文.