【发布时间】:2018-01-25 01:57:15
【问题描述】:
- 我有以下字典:
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
问题:
有没有办法让上面的dict理解通过引用返回?例如extracted['a'] = 2 将导致original['a'] = 2。
我不希望涉及更改 original 字典。
【问题讨论】:
-
简短回答:否。(无论如何,如果不更改您的数据类型 - 如果
extracted['a']和original['a']都是列表,那么您可以使它们相同对象)。 -
...如果您真的想要在远处进行幽灵般的动作,我想您可以实现自己的
dict-like 对象,该对象会了解原始对象并对其进行更新在__setitem__()。但这会打破人们对您的代码的期望,否则将是一个坏主意。 -
用类 C 语言的数据模型来思考 Python 的数据模型很少有成果。所以忘记“通过引用”的东西。有关此主题的更多信息,请参阅由 SO 资深人士 Ned Batchelder 撰写的Facts and myths about Python names and values。
-
OTOH,如果你让这些 dict 值可变,那么你可以改变它们,而不是分配给它们。例如,
original = {'a':[1], 'b':[2]}; extracted = {k:v for k,v in original.items() if k == 'a'}; extracted['a'][0] = 3; print(original)打印{'a': [3], 'b': [2]}
标签: python dictionary dictionary-comprehension