让dict理解通过引用返回

时间:2017-08-16 19:43:40

标签: python dictionary dictionary-comprehension

  • 我有以下字典:original = {a:1, b:2}
  • 然后我运行dict comprehension:extracted = {k:v for (k,v) in original.items() if k == 'a'}
  • 返回以下字典:{a:1}
  • 如果我改变extracted['a'] = 2original['a']仍将等于1

问题:

有没有办法让上述字典理解通过引用返回?例如,extracted['a'] = 2会产生original['a'] = 2

我不想涉及改变original字典。

2 个答案:

答案 0 :(得分:4)

你的预期目标(拥有一个字典,当更新时,也会更改其衍生的其他字典)即使使用不可变值也可以完成,如果你的新词典是添加了所需逻辑的自定义类型:

class MappedDict(dict):
    def __init__(self, orig, *args, **kwargs):
        self.__orig = orig
        dict.__init__(self, *args, **kwargs)
    def __setitem__(self, k, v):
        self.__orig[k] = v
        return dict.__setitem__(self, k, v)

d = {'a': 1, 'b': 2}
md = MappedDict(d, {k: v*2 for (k,v) in d.items()})
md['a']=5

... dmd都会'a'的值为5,而b会有所不同(2在前者和后者的4

答案 1 :(得分:2)

不,理解总是返回一个浅拷贝(好吧,实际上它是一个新对象,包含对你迭代的值的引用)。但是它只是一个浅层副本,因此如果您使用可变类型作为值并且您就地更改它们,则更改将传播到原始对象。

felm(y~x|z|0|q,data)$vcv