original = {a:1, b:2}
extracted = {k:v for (k,v) in original.items() if k == 'a'}
{a:1}
extracted['a'] = 2
,original['a']
仍将等于1
有没有办法让上述字典理解通过引用返回?例如,extracted['a'] = 2
会产生original['a'] = 2
。
我不想涉及改变original
字典。
答案 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
... d
和md
都会'a'
的值为5
,而b
会有所不同(2
在前者和后者的4
。
答案 1 :(得分:2)
不,理解总是返回一个浅拷贝(好吧,实际上它是一个新对象,包含对你迭代的值的引用)。但是它只是一个浅层副本,因此如果您使用可变类型作为值并且您就地更改它们,则更改将传播到原始对象。
felm(y~x|z|0|q,data)$vcv