0

namedtuple内部に含まれるリストは不変であると考えて、SETTINGS オブジェクトを作成しました。チェーン全体を通して、完全に変更可能な dict 内の元のリストへの参照のみが使用されるため、私は間違っていました。

.pop()したがって、リストを呼び出すと、 not-as-immutable-as-I-thought からも削除されnamedtupleます。#python でしばらくすると、なぜこれがすべて起こっているのかがわかりました。

私が知りたいのは、そのSETTINGSnamedtupleを行末として作成するにはどうすればよいですか? 他のオブジェクトへの参照なしで、ユーザーが適切に編集できる方法でデータだけですか? は人間が読み取り/編集するのが最も簡単なデータ構造であると感じてdictいるため、 を に解凍dictnamedtupleます。

>>> 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
>>>
4

1 に答える 1

2

タプルが実際にどのように機能するかについて混乱していると思います。「実際の」タプルでさえ、含まれているオブジェクトを不変にするわけではなく、タプル自体だけです。

>>> x  = [1,2,3]
>>> t = (x,0,3)
>>> t[0].append(4)
>>> t
([1, 2, 3, 4], 0, 3)

あなたがやりたいと思うのは.copy()、変更を開始する前のリストです。

>>> a = x.copy()
>>> t = (a,0,1)
>>> t[0].append(5)
>>> t
([1, 2, 3, 4, 5], 0, 1)
>>> x
[1, 2, 3, 4]
于 2014-07-10T03:28:36.063 に答える