namedtuple
内部に含まれるリストは不変であると考えて、SETTINGS オブジェクトを作成しました。チェーン全体を通して、完全に変更可能な dict 内の元のリストへの参照のみが使用されるため、私は間違っていました。
.pop()
したがって、リストを呼び出すと、 not-as-immutable-as-I-thought からも削除されnamedtuple
ます。#python でしばらくすると、なぜこれがすべて起こっているのかがわかりました。
私が知りたいのは、そのSETTINGSnamedtuple
を行末として作成するにはどうすればよいですか? 他のオブジェクトへの参照なしで、ユーザーが適切に編集できる方法でデータだけですか? は人間が読み取り/編集するのが最も簡単なデータ構造であると感じてdict
いるため、 を に解凍dict
しnamedtuple
ます。
>>> from collections import namedtuple
>>>
>>> _settings = {
... 'ROOM_NAMES': [
... 'Master Bedroom',
... 'Bath',
... 'Kitchen',
... 'Study',
... ],
... }
>>> _Settings = namedtuple('_Settings', [k for k in _settings.keys()])
>>> SETTINGS = _Settings(**_settings)
>>>
>>> names = SETTINGS.ROOM_NAMES
>>> names
['Master Bedroom', 'Bath', 'Kitchen', 'Study']
>>> type(names)
<class 'list'>
>>> # POP 'Study' OFF OF THE LIST
>>> name = names.pop()
>>>
>>> # THIS IS WHAT I EXPECT
>>> name in names
False
>>>
>>> # MISSING HERE AS THIS IS THE END OF THE LINE
>>> name in _settings['ROOM_NAMES']
False
>>>
>>> # MISSING HERE FROM MY NAMEDTUPLE IN THE MIDDLE OF THE LINE
>>> name in SETTINGS.ROOM_NAMES
False
>>>