[英]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.pop
、 set.pop
和deque.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.