[英]Python: Understanding dictionary view objects
我一直在試圖理解內置視圖對象通過返回.items()
.values()
.keys()
在Python 3或類似的.viewitems()
.viewvalues()
.viewkeys()
關於該主題還有其他線程,但沒有一個(甚至doc )似乎描述了它們在內部是如何工作的。
與 Python 2 list
返回的類型list
的副本相比,這里的主要收益似乎是高效的。經常將窗口與字典項進行比較(如在此線程中)。
但是那個窗口是什么,為什么它更有效?
我唯一能看到的是,視圖對象似乎是類似集合的對象,對於成員資格測試來說,它們通常更快。 但這是唯一的因素嗎?
代碼示例
>>> example_dict = {'test':'test'}
>>> example_dict.items()
dict_items([('test', 'test')])
>>> type(example_dict.items())
<class 'dict_items'>
所以,我的問題是關於這個dict_items
類。 這在內部如何運作?
主要優點之一是視圖是動態的:
>>> di={1:'one',2:'two',3:'three'}
>>> view=di.viewitems()
>>> view
dict_items([(1, 'one'), (2, 'two'), (3, 'three')])
>>> di[2]='new two'
>>> view
dict_items([(1, 'one'), (2, 'new two'), (3, 'three')])
因此,如果字典發生變化,您不需要重新生成項目、鍵或值列表(就像使用dict.items()
)。
將 Python 2 dict.items()
視為 dict 的一種副本 - 復制時的方式。
將 Python 3 dict.items()
或 Python 2 中的dict.viewitems()
視為 dict 現在的最新副本。 (顯然與 .viewkeys()、.viewvalues() 相同。)
Python 3.6 文檔有很好的示例說明為什么以及何時使用它。
值視圖不是類似設置的,因為字典可以有重復的值。 對於具有可散列值的字典,鍵視圖是類似設置的,項目視圖是類似設置的。
注意:在 Python 3 中,視圖用.keys()
.values()
或.items()
替換了 Python 2 的視圖。有些人可能依賴dict.keys()
或dict.values()
作為 dict 之前的靜態表示狀態可能有驚喜。
字典視圖存儲對其父字典的引用,並將視圖上的操作轉換為字典上的相應操作。
迭代 dict 視圖比構建列表並迭代它更有效,因為構建列表需要時間和內存,而您不必花費在視圖上。 舊的方式,Python 會遍歷 dict 的底層存儲來構建一個新的列表,然后你會遍歷這個列表。 迭代 dict 視圖使用迭代器直接遍歷 dict 的底層存儲,跳過不必要的列表步驟。
Dict 視圖還支持高效的包含測試和 setlike 交叉/差異/等。 操作,因為它們可以在底層 dict 上執行直接哈希查找,而不是遍歷列表並逐個元素檢查相等性。
如果你想看 CPython 使用的具體實現,你可以去官方倉庫看看,但是這個實現可能會發生變化。 它已經改變了,反復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.