這可能是一個愚蠢的問題,但爲什麼這段代碼的行爲如此?IF語句(檢查列表中的字符串)行爲異常
>>> test = ['aaa','bbb','ccc']
>>> if 'ddd' or 'eee' in test:
... print True
...
True
>>>
我期待stdio上沒有任何東西打印出來,因爲IF語句中的字符串都不在列表中。
我錯過了什麼嗎?
這可能是一個愚蠢的問題,但爲什麼這段代碼的行爲如此?IF語句(檢查列表中的字符串)行爲異常
>>> test = ['aaa','bbb','ccc']
>>> if 'ddd' or 'eee' in test:
... print True
...
True
>>>
我期待stdio上沒有任何東西打印出來,因爲IF語句中的字符串都不在列表中。
我錯過了什麼嗎?
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'))
:
您的測試應該是
if 'ddd' in test or 'eee' in test:
在你的代碼目前已經「DDD」字符串被計算爲布爾而且由於它不是空的布爾值爲True
你失去了一些東西在這裏:
if 'ddd' or 'eee' in test:
等同於:
if ('ddd') or ('eee' in test):
就這樣,將永遠是正確的,因爲'ddd'
被認爲是真實的。
你想:
if any(i in test for i in ('ddd', 'eee')):
>>> if 'ddd'
... print True
將打印
True
所以,你應該寫:
>>> if 'ddd' in test or 'eee' in test:
... print True
以得到你想要的結果。