通过引用使字典理解 return
Make dict comprehension return by reference
- 我有以下字典:
original = {a:1, b:2}
- 然后我运行听写理解:
extracted = {k:v for (k,v) in original.items() if k == 'a'}
- 以下字典是 returned:
{a:1}
- 如果我改变
extracted['a'] = 2
,original['a']
仍将等于 1
问题:
有没有办法让上面的字典理解return通过引用?例如 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
在后者)。
不,理解 总是 return 一个浅拷贝(好吧,实际上它是一个包含对您迭代的值的引用的新对象)。然而,它只是一个浅表副本,因此如果您使用可变类型作为值并就地更改它们,更改将传播到原始对象。
>>> 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]}
- 我有以下字典:
original = {a:1, b:2}
- 然后我运行听写理解:
extracted = {k:v for (k,v) in original.items() if k == 'a'}
- 以下字典是 returned:
{a:1}
- 如果我改变
extracted['a'] = 2
,original['a']
仍将等于1
问题:
有没有办法让上面的字典理解return通过引用?例如 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
在后者)。
不,理解 总是 return 一个浅拷贝(好吧,实际上它是一个包含对您迭代的值的引用的新对象)。然而,它只是一个浅表副本,因此如果您使用可变类型作为值并就地更改它们,更改将传播到原始对象。
>>> 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]}