簡體   English   中英

讓dict理解通過引用返回

[英]Make dict comprehension return by reference

  • 我有以下字典: original = {a:1, b:2}
  • 然后我運行dict理解: extracted = {k:v for (k,v) in original.items() if k == 'a'}
  • 返回以下dict: {a:1}
  • 如果我改變extracted['a'] = 2original['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

...將使dmd '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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM