我创建了一个SETTINGS对象作为namedtuple
,认为里面包含的列表是不可变的。我是不正确的,因为通过整个链只使用完全可变的dict中的原始列表的引用。
因此,当我在我的列表上调用.pop()
时,它也会将其从我不可思议的{I} namedtuple
中移除。现在我在#python中了解了一段时间后为什么会发生这种情况。
我想知道的是:我如何创建SETTINGS namedtuple
作为行尾?只是数据,没有引用任何其他对象,很好地 - 用户可编辑的方式?我觉得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
>>>
答案 0 :(得分:2)
我认为你对元组的实际工作方式感到困惑。即使是真实的&#39;元组不会使包含的对象不可变,只是元组本身:
>>> 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]