编程语言
首页 > 编程语言> > python – 是否有“中等”镜头这样的东西?或者:如何精细控制副本的“深度”?

python – 是否有“中等”镜头这样的东西?或者:如何精细控制副本的“深度”?

作者:互联网

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

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

当我使用普通副本 – dict.copy()或copy.copy(dict)时 – 我对复制字典中的列表所做的任何更改也会更改原始字典的列表.

但是,当我使用copy.deepcopy(dict)时,它会一直运行并创建新对象,因此我不能将原始字典的列表用作“待办事项”,因为我从中移除特定对象复制字典的列表,或对复制的字典列表进行任何其他类型的更改,这些更改需要与原始对象进行比较.

关于“复制”模块(https://docs.python.org/2/library/copy.html)的文档似乎没有提及任何类型的中间选项,或某种方式来调整深度.

是否存在这样的选项或功能?如果没有,我只是从错误的角度思考问题?例如,我想我可能能够实现所需的行为,如果我遍历字典并手动“复制”那样的东西(但这似乎相当冗长!?).

解决方法:

您可以实现自己的“中型”版本:

import copy


def mediumcopy(value):
    return dict(
        (key, copy.copy(val))
        for key, val in value.iteritems())

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

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

标签:python,dictionary,python-2-7,deep-copy
来源: https://codeday.me/bug/20190623/1267066.html