Python 有“a”这样的东西吗;“中等”-复制或:如何精细控制;“深度”;复印件?
我有一本字典。字典键是整数,值是对象列表 我希望能够以这样一种方式复制字典,即我引用相同的对象,但不同的列表 当我使用普通副本(dict.copy()或copy.copy(dict))时,我对复制的词典中的列表所做的任何更改都会更改原始词典的列表 但是,当我使用copy.deepcopy(dict)时,它会一直运行并生成新对象,因此我不能,例如,在从复制的字典列表中删除特定对象时,使用原始字典的列表作为“待办事项”,或者对复制的字典列表进行任何其他类型的更改,需要与原始对象进行比较 “复制”模块()的文档似乎没有提到任何中间选项,也没有提到调整深度的方法Python 有“a”这样的东西吗;“中等”-复制或:如何精细控制;“深度”;复印件?,python,python-2.7,dictionary,deep-copy,Python,Python 2.7,Dictionary,Deep Copy,我有一本字典。字典键是整数,值是对象列表 我希望能够以这样一种方式复制字典,即我引用相同的对象,但不同的列表 当我使用普通副本(dict.copy()或copy.copy(dict))时,我对复制的词典中的列表所做的任何更改都会更改原始词典的列表 但是,当我使用copy.deepcopy(dict)时,它会一直运行并生成新对象,因此我不能,例如,在从复制的字典列表中删除特定对象时,使用原始字典的列表作为“待办事项”,或者对复制的字典列表进行任何其他类型的更改,需要与原始对象进行比较 “复制”模块
这样的选项、功能或其他东西是否存在?如果不是,我只是从错误的角度思考问题吗?例如,我设想,如果我反复使用字典并以这种方式手动“复制”内容,我可能能够实现所需的行为(但这似乎很冗长!?)。您只需实现自己版本的“介质”-复制: Python 3版本:
def mediumcopy(value):
return {key: list(val) # you can still use copy.copy here
for key, val in value.items()}
z = {'a': [[1], [2]]}
zcopy = mediumcopy(z)
assert id(z) != id(zcopy) # True
assert id(z['a']) != id(zcopy['a']) # True
assert id(z['a'][0]) == id(zcopy['a'][0]) # True
您需要创建
列表
s的副本(它们是您的目录
的值)。即使没有copy.copy()
,您也可以这样做
将创建具有相同内容的旧列表
的副本
,并将其存储为新列表
因此,创建新dict的dict理解表达式应为:
new_dict = {k: list(v) for k, v in my_dict.items()}
其中
my\u dict
是您的原始dict。您可以创建dict
的子类,将\u deepcopy\u\u
方法实现为浅拷贝,并在您希望deepcopy停止的级别使用该子类(而不是原生dict
)。您比我快了大约两分钟。我只是打了一个同样的回答。:-)@李子:):)这是有道理的!我想,我会为不同的“深度”编写另一个版本(或者在函数或其他东西中添加一个“如果”,但实际上工作量相同)?(我的个人项目只有一种“深度”,只有一个例外,所以这不是问题,但我可以想象。)
new_list = list(old_list)
new_dict = {k: list(v) for k, v in my_dict.items()}