2010-09-19 59 views

回答

168

每蟒蛇容器C,期望是

for item in C: 
    assert item in C 

將通過就好了 - 不會找到它,如果驚人的in一個感(循環子句)有一個完全不同的來自其他人的意思(存在檢查)?我當然會!這自然這樣工作的列表,集合,元組,...

所以,當C是一本字典,如果in是產生鍵/值元組在for循環,然後通過最小驚訝的原則, in也必須在收容檢查中使用它的左手操作數這樣的元組。

那會是多麼有用?好看不中用的確,基本上使if (key, value) in Cif C.get(key) == value的代名詞 - 這是一張支票,我相信我可能已經執行,或要執行,100倍以上的很少超過if k in C實際意味着什麼,檢查重點的存在並完全忽略了價值。

在另一方面,想循環剛上鍵是相當普遍,如:

for k in thedict: 
    thedict[k] += 1 

具有價值,以及不會特別幫助:

for k, v in thedict.items(): 
    thedict[k] = v + 1 

居然少了幾分清晰不那麼簡潔。 (請注意,items是用於獲取鍵/值對的「正確」方法的原始拼寫:不幸的是,這些訪問器返回整個列表的日子已經恢復,因此爲了支持「只重複」替代拼寫,必須引入了iteritems,在Python 3中,與之前Python版本的向後兼容性約束大大減弱,它又變成了items)。

+2

非常明確的解釋。我想我需要再看一下python的「引擎蓋下」。 'in'和'for x in'操作員的工作方式對我來說仍然有點神奇。 – Falmarri 2010-09-19 09:35:48

+0

@Falmarri,我會很高興在概念層面解釋了(無需挖成C源;-)如果你問的是另外一個問題 - !) – 2010-09-19 14:24:32

+0

我是一個C++程序員,所以大概挖成C可能更有幫助=] python中的操作符是如何工作的,對我來說有點不直觀(至少從低級理解來說)。 – Falmarri 2010-09-19 22:17:59

9

我的猜測默認行爲:使用完整的元組會更直觀的循環,但也許沒有那麼測試會員使用in

if key in counts: 
    counts[key] += 1 
else: 
    counts[key] = 1 

,如果你要同時指定鍵和值in該代碼將沒有真正的工作。我很難想象用例,你會檢查字典中的AND值是否都在字典中。僅測試按鍵就更自然了。

# When would you ever write a condition like this? 
if (key, value) in dict: 

現在是沒有必要的,in運營商和for ... in在相同的項目進行操作。在實施方面,它們是不同的操作(__contains____iter__)。但是,這種小小的不一致性會讓人感到困惑,而且不一致。

+0

鑑於對於我可以想到的其他類型的內置迭代,只有在'for i in foo'中的'i'在某個點處假定'x'的值時,'x in foo' ,我會說這將是一個非常大的不一致。 – aaronasterling 2010-09-19 05:49:19