2014-01-18 27 views
0
varA = 1 

varB = 2 

代碼瓦特/正確的結果:的Python - 語法與類型布爾表達式或者

if type(varA) == type('a') or type(varB) == type('a'): 
    print "string involved (either varA or varB is a string)" 
else: 
    print "varA and varB are not strings" 

代碼瓦特/不正確的結果:

if type(varA) or type(varB) == type('a'): 
    print "string involved (either varA or varB is a string)" 
else: 
    print "varA and varB are not strings" 

到底爲什麼做的第二組代碼不會返回預期結果(即「varA和varB不是字符串」)? Python對第二套代碼做的一步一步分解是什麼?我發現一個類似的問題已經得到解答,但並沒有完全理解這個解釋。 Python: If-else statements

+0

適當的形式將是__type(瓦拉)是str__ – volcano

+0

可能重複的[如果x或y或z == blah](http://stackoverflow.com/questions/15112125/if-x-or-y-or-z-blah) –

+0

@volcano:更好的形式是'isinstance(varA, str)',以允許子類。 –

回答

3

在第二代碼片段,if語句的條件是由Python的解釋是這樣的:

if (type(varA)) or (type(varB) == type('a')): 

此外,它會總是評估爲True

這是因爲,無論什麼varA值,type(varA)評估爲True

>>> varA = 'a' 
>>> bool(type(varA)) 
True 
>>> varA = False 
>>> bool(type(varA)) 
True 
>>> 

事實上,自從Python的邏輯運算符的短路(停止儘快評估),該type(varB) == type('a')部分條件將永遠不會被評估。


在一個單獨的說明,你應該用is比較類型:

if type(varA) is str or type(varB) is str: 

,或者您可以使用isinstance:因爲在第二種情況下

if isinstance(varA, str) or isinstance(varB, str): 
+0

感謝您的快速回答!因此,{type(varA)}始終爲{True},因此無論{varA}的實際類型如何,Python都會運行與True對應的代碼。 – AyeSea

+0

@ Acey9 - 的確如此。 – iCodez

-1

你是不是比較這兩個變量。任何大於0的整數都將返回True,因此您不在此處比較類型。

if type(varA): 

將始終爲真,因爲varA等於1.您甚至不會到達條件的第二部分。

+0

錯誤,類型(0)是int。 – volcano

+0

不是我說的。類型(0)是int,但根據python它也是False。檢查:if 0 == False:print 123 –

+0

type(varA)不是整數。並且任何非0值 - integer或float - 在布爾表達式中計算爲True。這裏是我的一段代碼__if -1:print「Alex Hristov is wrong」__ ;-) – volcano

0

iCodez是絕對正確的,但如果你真的想要做的事沿着線「列表中的所有元素,並檢查其中之一是一個字符串」:

if str in map(type, [varA, varB]): 
    print "string involved" 
1

你的第二個例子不工作,因爲它解析作爲

if (type(varA)) or (type(varB) == type('a')): 

type(varA)永遠是這被認爲是True類類型,所以整個表達式將是True


有更好的方法來做到這一點

if any(isinstance(v, str) for v in (varA, varB)): 

any需要一個迭代,並計算爲True如果在迭代什麼是真實的。 isinstance檢查第一個參數是否是第二個參數。配售發電機表達的任何內部讀作「如果(內翻,varB)任何v是一個字符串):...」

>>> var = 1 
>>> isinstance(var, str) # var is an int, not a str 
False 
>>> isinstance(var, int) 
True 
>>> isinstance('a', int) 
False 
>>> isinstance('a', str) # 'a' is a str 
True