Python,如何使用新属性将dict移动到自身下?例如dict ['key'] = dict

时间:2016-07-28 06:07:09

标签: python dictionary

我有一个非常大的字典数组,需要将每个字典本身放在一个新密钥下面。

我知道dict['key'] = dict无效,会在python中产生递归的dict。目前,我正在做类似的事情:

new_dict['key'] = old_dict

它会浪费记忆力,有没有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

dict 可以拥有对自己的引用:

>>> d = {'foo': 'bar'}
>>> d['self'] = d
>>> d
{'self': {...}, 'foo': 'bar'}
>>> d['self']['self']['self']['self']['foo']
'bar'

当然,有一些你不能做的事情(例如把它转储到json):

>>> import json
>>> json.dumps(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
ValueError: Circular reference detected

如果您确实需要以某种方式坚持这一点,那么除了在将其添加到自身时复制它之外,您可能没有其他选项:

d = {'foo': 'bar'}
d['self'] = d.copy()

或者编写某种自定义逻辑,以便在反序列化时,使用dict本身替换某些标记值(根据您需要此特定功能的原因,可能会也可能不起作用)

答案 1 :(得分:2)

在mgilson的回答中加一点:

new_dict['key'] = old_dict

不会浪费记忆。此赋值运算符仅将引用分配给old_dict。来自old_dict的元素不会被复制。

但无论你如何做 - 直接或通过不同的变量名称,你都会获得循环引用,这对某些用法有效,对其他用途无效。