如何在不复制对象的情况下将var添加到Python列表中?

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始终是相同的,因此错误必须在其他地方.感谢所有人的帮助,我希望这篇文章可以帮助其他人.

Bre*_*arn 5

你已经被存储的对象,即整数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变量的工作方式很有帮助,例如本文本文.