簡體   English   中英

Python:理解字典視圖對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM