2011-08-29 43 views
6

有幾種不同的方法來檢查,如果一個Python字典包含特定鍵,即檢查Python字典的特定鍵

d = {} 

if key in d: 

if d.contains(key): 

if d.has_key(key): 

這是愚蠢的語言,讓你做同樣的事情幾種不同的方式,除非每種方法都做了完全不同的事情。有人可以對比以上三種技術,它們有什麼不同?

+0

從未見過d.contains(),是新的? – steabert

+7

@steabert:可能應該是'__contains__' – Gerrat

+0

啊,謝謝,沒有想到這個,我傾向於保持清楚:) – steabert

回答

5

d.__contains__(key)是用什麼key in d(因爲in操作者調用詞典__contains__法)

has_key已被棄用,不一樣__contains__

12

他們都是一樣的,他們都是由於歷史原因,但你should usekey in d

+0

我不認爲'__contains__'是因爲歷史原因而「變動」的嗎?它不像它會很快被棄用... –

+0

也許你想進一步闡述爲了querent的好處嗎? –

+0

當然...我添加了一個答案。 –

7

方法#1是可接受的方式。方法#2實際上並不存在,至少在我知道的任何Python版本中都是如此;我很想看看你在哪裏找到的。方法#3曾經是被接受的方式,但現在是deprecated

所以真的只有一種方法。

+1

也許他正在考慮'__contains__' – Gerrat

+4

只是爲了回答這個問題......如果他*想着'__contains__' - 答案是這是一種特殊的方法來實現'b在一個'... vm將a引用中的任何'b轉換爲對'a .__包含__(b)'後面的調用,很像'a [b]'被轉換爲'a .__ getitem __(b)'。特殊的'__xxx__'方法是python如何爲語言公開提供的所有語法糖提供一個乾淨的基於方法的實現。 –

4
  • key in d是接受的方式做到這一點。

  • __contains__是實現上述語法的魔術屬性(ref)。大多數(如果不是全部的話)特殊語法通過這些方法來實現。例如,with聲明是通過__enter____exit__實現的。存在這種方法允許爲用戶定義的類提供特殊的功能。

  • has_key方法不再在Python 3存在,並且在Python已棄用2.

+0

注意到Python並沒有真正的私有方法... – NullUserException

+0

@NullUserException:謝謝,我查了一下它的正確名稱。 –