gpt4 book ai didi

模块级别的 Python 列表

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:21 27 4
gpt4 key购买 nike

我将我的问题分解为以下示例程序

xy8_block = [
{'pulse': {}},
]

class Dummy:
def __init__(self, block=list(xy8_block)):
self._block = block


dumdum = Dummy()
dumdum._block[0]['pulse']['test'] = 0
print(xy8_block)

如果我运行程序,变量 xy8_block已更改,尽管变量 dumdum._blockxy8_block 有不同的内存地址。

如何在不直接初始化的情况下避免这个问题具有值的类。

提前致谢。

最佳答案

代替:

def __init__(self, block=list(xy8_block)):

做:

from copy import deepcopy
def __init__(self, block=deepcopy(xy8_block)):

当您执行 list(my_list) 时,您执行的是列表的副本,这意味着它的元素仍然通过引用进行复制。

换句话说,正如您正确提到的那样,xy8_blockdumdum._block 确实具有不同的内存地址。但是,如果您检查 xy8_block[0]dumdum._block[0] 的内存地址,您会发现它们是相同的。

通过使用 deepcopy,您可以复制列表它的元素值,而不是它们的引用。

编辑

正如@FMc 明智地指出的那样,这仍然会使所有实例的 _block 属性指向同一个对象,因为 deepcopy 产生的列表是在方法的定义,而不是它的执行。所以这是我的建议:

from copy import deepcopy

class Dummy:
def __init__(self, block=None):
self._block = block or deepcopy(xy8_block)

关于模块级别的 Python 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40792168/

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