Python 有“a”这样的东西吗;“中等”-复制或:如何精细控制;“深度”;复印件?

Python 有“a”这样的东西吗;“中等”-复制或:如何精细控制;“深度”;复印件?,python,python-2.7,dictionary,deep-copy,Python,Python 2.7,Dictionary,Deep Copy,我有一本字典。字典键是整数,值是对象列表 我希望能够以这样一种方式复制字典,即我引用相同的对象,但不同的列表 当我使用普通副本(dict.copy()或copy.copy(dict))时,我对复制的词典中的列表所做的任何更改都会更改原始词典的列表 但是,当我使用copy.deepcopy(dict)时,它会一直运行并生成新对象,因此我不能,例如,在从复制的字典列表中删除特定对象时,使用原始字典的列表作为“待办事项”,或者对复制的字典列表进行任何其他类型的更改,需要与原始对象进行比较 “复制”模块

我有一本字典。字典键是整数,值是对象列表

我希望能够以这样一种方式复制字典,即我引用相同的对象,但不同的列表

当我使用普通副本(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()}