模块级别的Python列表

时间:2016-11-24 17:42:02

标签: python

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

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._block和...都已更改 xy8_block具有不同的内存地址。

如果不直接初始化,如何避免此问题 具有价值的类。

提前致谢。

2 个答案:

答案 0 :(得分:4)

而不是:

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)

答案 1 :(得分:2)

每次都获得一个新的块:

def new_xy8_block():
    return [{'pulse': {}}]

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

ds = [Dummy() for _ in range(5)]
ds[0]._block[0]['pulse']['test'] = 0

for d in ds:
    print d._block