2013-10-14 84 views
-5

這可能是一個愚蠢的問題,但爲什麼這段代碼的行爲如此?IF語句(檢查列表中的字符串)行爲異常

>>> test = ['aaa','bbb','ccc'] 
>>> if 'ddd' or 'eee' in test: 
...  print True 
... 
True 
>>> 

我期待stdio上沒有任何東西打印出來,因爲IF語句中的字符串都不在列表中。

我錯過了什麼嗎?

回答

7

if 'ddd' or 'eee' in test

是評估爲:

if ('ddd') or ('eee' in test)

作爲非空字符串始終爲True,所以or操作短路並返回True

>>> bool('ddd') 
True 

爲了解決這個問題,你可以使用:

if 'ddd' in test or 'eee' in test:

any

if any(x in test for x in ('ddd', 'eee'))

4

您的測試應該是

if 'ddd' in test or 'eee' in test: 

在你的代碼目前已經「DDD」字符串被計算爲布爾而且由於它不是空的布爾值爲True

0

你失去了一些東西在這裏:

if 'ddd' or 'eee' in test:

等同於:

if ('ddd') or ('eee' in test):

就這樣,將永遠是正確的,因爲'ddd'被認爲是真實的。


你想:

if any(i in test for i in ('ddd', 'eee')): 
0
>>> if 'ddd' 
...  print True 

將打印

True 

所以,你應該寫:

>>> if 'ddd' in test or 'eee' in test: 
...  print True 

以得到你想要的結果。