簡體   English   中英

dict.pop 與 dict.get 的默認返回值

[英]dict.pop versus dict.get on the default return value

我試圖找出將None作為dict.get的默認值但沒有默認值(未指定默認值)的原因是dict.pop

{}.get('my_key')
# output: None
{}.pop('my_key')
# output: KeyError: 'my_key'

我在想dict.pop沒有隱式默認值的原因是因為你可能有值為None的鍵所以,為了不混淆你的鍵是否在字典中, dict.pop沒有多大意義。 但是話又說回來,這種解釋也應該對dict.get有效,但不是:

{'my_key': None}.get('my_key')
# output: None
# but doesn't tell you if the key is truly in the dictionary or not

如果您主要關心的是字典中是否存在鍵,則應通過'my_key' in my_dict完成。 .get.pop正如您想象的那樣,用途略有不同。 .get是嚴格的檢索, .pop是檢索刪除。 您將希望使用最適合您的用例的相應方法,如果您不需要處理KeyError ,則使用默認值。

至於.pop默認不使用默認值的原因,是因為該操作還希望從字典中刪除一個鍵。 如果操作成功完成而沒有引發錯誤,則可能會錯誤地期望鍵也從字典中刪除。

對於.get ,該方法專門作為提供默認值的替代方法而存在__getitem__方法,您通常將其語法視為my_dict['my_key'] 如果密鑰不存在,后者將引發KeyError

get在某種意義上以兩種形式存在:一種引發KeyError ,另一種不引發。

>>> {}['my_key']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'my_key'
>>> {}.get('my_key')
>>>

另一方面, pop不是引發KeyError的另一個操作的無錯誤版本,因此它用於兩種情況:默認情況下引發KeyError ,但如果需要則返回默認值。

>>> {}.pop('my_key')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'my_key'
>>> {}.pop('my_key', 3)
3

讀取鍵的確切值的方法是

{}['my_key']

dict.get(key[, default]) 是嘗試獲取值,如果不是返回“默認”版本。

help(dict.get)

get(...)
    D.get(k[,d]) -> D[k] if k in D, else d.  d defaults to None.

我對此的看法是允許dict在不同的上下文中使用。

使用dict.get(key)我們總是得到一個值,即使鍵不存在於dict中。 可以提供默認值。 沒有例外。 dict沒有改變。

使用dict.pop(key)時,只有當key存在於dict中時,我們才會得到一個值,否則會引發異常。 我們可以通過提供默認值來避免異常。 dict被改變了。

為了測試key是否存在,我們key in dict

對於dict.pop ,這提供了與list.popset.popdeque.pop提供的接口類似的接口。

簡而言之,這是 “最小驚奇原則”和 Python 之禪的一個很好的例子(導入這個):)

這里有一個示例向您展示幕后基本發生的事情,如果密鑰存在,還顯示兩者之間的區別:

In [3]: foo = {'my_key': 'value', 'other_key': 'other_val'}                                  

In [4]: foo.get('my_key')                                                                    
Out[4]: 'value'

In [5]: bar = foo.pop('other_key')                                                           

In [6]: bar                                                                                  
Out[6]: 'other_val'

In [7]: foo                                                                                  
Out[7]: {'my_key': 'value'}

In [8]:  

這就是我所相信的:

pop() 主要目的:取值+刪除 get() 主要目的:取值

如果“值”部分失敗,您的程序可以處理它,甚至可以繼續 None 。 也許您只是想測試是否有鑰匙。 使用 get() 實際上被命名為 check-if-value-is-present-in-dict 問題的解決方案。

如果“刪除”失敗,您通常沒有測試刪除,但實際上想刪除並犯了一些例如索引錯誤。 因此,如果這不起作用,您應該被告知。

所以你可能會說“這種行為是定義的結果,而不是解釋的結果”,是的,我認為的解釋是,以前在其他編程語言 (C) 中也存在相同的行為,將其實現為有意義的Python。 它可能隱藏得更深。

FredrikHedman 的回應:

簡而言之,這是“最小驚奇原則”和 Python 之禪的一個很好的例子(導入這個):)

這對我也有意義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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