[英]Make dict comprehension return by reference
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
字典的改動。
如果您的新詞典是自定義類型並添加了所需的邏輯,那么您的預期目標(具有更新后的字典,也將更改其衍生的其他字典)即使使用不可變值也可以完成:
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
)。
不,理解總是返回一個淺拷貝(實際上,它是一個包含對你迭代的值的引用的新對象)。 但是它只是一個淺的副本,因此如果您使用可變類型作為值並且您就地更改它們,則更改將傳播到原始對象。
>>> original = {'a':[], 'b':[]}
>>> extracted = {k:v for (k,v) in original.items() if k == 'a'}
>>> extracted['a'].append(1) # change one value in extracted in-place
>>> original # original also changed
{'a': [1], 'b': []}
>>> extracted
{'a': [1]}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.