私は非常に大きな辞書の配列を持っており、それぞれの辞書自体を新しいキーの下に置く必要があります。Python、新しい属性でdict自体を移動する方法は?例えば、dict ['key'] = dict
私はdict['key'] = dict
が動作しないことを知っており、Pythonで再帰的なdictが発生します。現在、私は次のようなことをしています:
new_dict['key'] = old_dict
そしてそれはより良い方法ですか?
私は非常に大きな辞書の配列を持っており、それぞれの辞書自体を新しいキーの下に置く必要があります。Python、新しい属性でdict自体を移動する方法は?例えば、dict ['key'] = dict
私はdict['key'] = dict
が動作しないことを知っており、Pythonで再帰的なdictが発生します。現在、私は次のようなことをしています:
new_dict['key'] = old_dict
そしてそれはより良い方法ですか?
(またはあなたは、この特定の機能を必要とする理由に応じて動作してもしなくてもよい)dict
自体に一定の番兵を置き換えるように、カスタム・ロジックのいくつかの並べ替えを書きます小さなビットからmgilsonの答えまで:
new_dict['key'] = old_dict
はメモリの無駄ではありません。この代入演算子は、の参照番号のみをold_dictに割り当てます。 old_dictの要素はコピーされません。
しかし、どのように行うかに関係なく、直接または別の変数名を使用すると、いくつかの用途で有効であり、他のものでは有効ではない循環参照が得られます。
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をダンプする必要があります。再帰的なdictは機能しません。 – xlrtx
完全に忘れられたオブジェクトは参照渡しされます。 – xlrtx