gpt4 book ai didi

Python - 通过引用复制

转载 作者:太空狗 更新时间:2023-10-30 00:25:42 28 4
gpt4 key购买 nike

是否有可能通过引用复制变量,无论它是 int 还是类实例?

我的目标是拥有两个包含相同对象的列表,并且当一个对象发生变化时,第二个对象就会发生变化。

换句话说,我需要指点:/


我只是想要 int、float 和其他通常按值复制的标准类型,强制按引用复制。这将使我的代码更加一致。

如果没有这种可能性,类包装器是最好的解决方案。

最佳答案

Python 始终通过引用工作,除非您明确要求副本(内置列表的一部分被视为“要求副本”——但 numpy 数组的一部分也通过引用工作)。然而,正因为如此,alist=anotherlist; alist.sort() 表示对单个列表对象(具有两个等效名称 alistanotherlist)进行排序——您不能在同时在同一个列表对象上。

因此,在这种情况下,您必须明确要求一份副本(例如alist=list(anotherlist))——一旦您这样做了,就会有两个不同的列表对象之间不再有联系。你不能同时拥有这两种方式:要么你通过引用工作(并且有一个列表对象,因此只有一个排序!),或者你制作一个副本(在这种情况下你最终会得到两个单独的列表对象)。

您可以利用到目前为止讨论的副本这一事实——两个列表引用的对象(项)相同的。 . 直到并且除非您对任一列表中的项目执行删除、添加或重新分配(另一方面,可变项目的突变不会改变这种联系:这是一个完全独立且与任何列表截然不同的情况综上所述,由于删除、添加和重新分配是列表上的操作,而调用项目上的变异方法是项目上的操作——项目忽略了对引用它们的一个或多个列表的任何操作,列表将忽略对它们引用的一个或多个项目的任何操作)。

对于删除和添加,您无能为力,除了按照其他答案中的建议将两个列表包装并同步到一个对象中;但是对于项目的重新分配,如果这就是您所需要的,您可以通过添加一个间接级别将它们变成项目的突变 -- 而不是直接引用一个列表元素,请引用例如到单项子列表。例如:

>>> alist = list([x] for x in 'ciao')
>>> blist = list(alist)
>>> blist.sort()
>>> alist
[['c'], ['i'], ['a'], ['o']]
>>> blist
[['a'], ['c'], ['i'], ['o']]
>>> blist[-1][0] = 'z'
>>> blist
[['a'], ['c'], ['i'], ['z']]
>>> alist
[['c'], ['i'], ['a'], ['z']]

这个额外间接级别的概念是否可以帮助您真正尝试做的事情,只有您自己才能知道,因为我们并不真正知道您< strong>正在尝试做;-).

关于Python - 通过引用复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com