0

我創建了一個SETTINGS對象作爲namedtuple,認爲裏面的列表是不可變的。我是不正確的,因爲通過整個鏈只使用完全可變字典中對原始列表的引用。如何讓我的namedtuple實際上不可變?

因此,當我在我的名單上呼叫.pop()時,它也將它從我不像我想象的那樣不可改變的namedtuple中移除。現在,我在#python中瞭解了一段時間以後,爲什麼這一切都會發生。

我想知道的是:我該如何創建該設置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 
>>> 

回答

1

我想你感到困惑的元組是如何工作的。即使是「真正的」元組不作包含的對象不變,只是元組本身:

>>> 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] 
相關問題