我将我的问题分解为以下示例程序
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
具有不同的内存地址。
如果不直接初始化,如何避免此问题 具有价值的类。
提前致谢。
答案 0 :(得分:4)
而不是:
def __init__(self, block=list(xy8_block)):
执行:
from copy import deepcopy
def __init__(self, block=deepcopy(xy8_block)):
执行list(my_list)
后,您会对列表执行浅副本,这意味着其元素仍会被引用复制。
换句话说,正如您所正确提到的,xy8_block
和dumdum._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