2013-06-03 65 views
2
True and "asdf" or "qwer" 

結果=> 「ASDF」如何在python的字符串布爾運算符的工作

False and "asdf" or "qwer" 

結果=> 「QWER」

我不明白這些東西是如何工作的。我認爲布爾運算符字符串會使類型錯誤,但它沒有。它是否像預定義的語句,比如「a if b else c」?

回答

4

Python 確定了答案後停止操作並返回最後一個掃描對象的值。他們不回。我喜歡這個功能,並且一直都在使用它。

由於因爲答案現在確定當它擊中非空字符串算作真正

True and "asdf" or absolutely_anything_here_or_following 

停止計算(該值中的一個爲真),並返回最後它檢查的東西(「asdf」)。甚至沒有進一步的操作數被檢查。

在另一方面,當

False and "asdf" or absolutely_anything_here 

,它不知道anwser卻又如此繼續下一個操作數。只要absolute_anything_here是最後一個操作,就會確定答案,並返回最後一次掃描的內容。

3

andor就像熟悉的布爾運算符一樣工作 - 如果兩個操作數都爲真,它們將返回true,如果其操作數中的一個操作數爲true,則返回true。

它們也短路,就像&&||

然而,在Python,這裏什麼都可以解釋爲一個布爾上下文是TrueFalse,還有一個額外的事實 - 它會返回評估,以True或在布爾環境評估,以False第一個操作數,當它有足夠的信息來停止評估。 (這與構建並返回一個真實的布爾值TrueFalse相反。)這樣做是可以的,因爲如果它是布爾評估的,它將評估它將返回的布爾值,如果不是這個事實。

因此(注意""被評估以False在布爾上下文):在python

>>> "" and "a" 
'' 
>>> "a" and "b" 
'b' 
>>> "a" and "" 
'' 
>>> 


>>> "" or "" 
'' 
>>> "a" or "" 
'a' 
>>> "" or "a" 
'a' 
>>> "a" or "b" 
'a' 

>>> "" or False 
False 
>>> "" or True 
True 

>>> False and "" 
False 
0

對象視爲真的假(如, '',無)

的布爾的結果結果依賴於可以確定結果的最後一個值。

打印 'AA' 和True

'AA' 是真實的,但不能確定的結果,所以結果輪到真

print True and 'aa' 

'aa'

但運營商還是從運營商不同,看到

print None and True 

第一個無被認爲是假,它可以決定最後的結果, 所以其打印「無」

print False or 'bb' 

'BB'

因爲第一個False不能確定最終結果!

2

Python的條件運算符之前:

>>> age=20 
>>> 'legal' if age>=21 else 'not legal' 
'not legal' 

曾經有「貨物代碼」作爲工作基於索引的元組周圍:

>>> ('not legal','legal')[age>=21] 
'not legal' 
>>> age=22 
>>> ('not legal','legal')[age>=21] 
'legal' 

可以拆卸,你張貼的兩個備選方案看看底下發生了什麼:

>>> import dis 
>>> def f(): 
... x=True and "asdf" or "qwer" 
... y=False and "asdf" or "qwer" 
... 
>>> dis.dis(f) 
    2   0 LOAD_GLOBAL    0 (True) 
       3 POP_JUMP_IF_FALSE  12 
       6 LOAD_CONST    1 ('asdf') 
       9 JUMP_IF_TRUE_OR_POP  15 
     >> 12 LOAD_CONST    2 ('qwer') 
     >> 15 STORE_FAST    0 (x) 

    3   18 LOAD_GLOBAL    1 (False) 
      21 POP_JUMP_IF_FALSE  30 
      24 LOAD_CONST    1 ('asdf') 
      27 JUMP_IF_TRUE_OR_POP  33 
     >> 30 LOAD_CONST    2 ('qwer') 
     >> 33 STORE_FAST    1 (y) 
      36 LOAD_CONST    0 (None) 
      39 RETURN_VALUE 

你可以看到你的值你會看到你所看到的價值。你也可以看看boolean operators的短路行爲,看看這是記錄的行爲。

0

第一個例子
Python掃描並從左向右評估。

在您的第一示例

True and "asdf" or "qwer"

評估爲

"asdf" or "qwer"

是,由於非空字符串爲True,Python的短路(忽略第二個操作數),並返回第操作數"asdf"。不管x的值如何,請記住True or x將返回True

第二個例子

False and "asdf" or "qwer"

這個計算結果爲

False or "qwer"

這次我們做的第一個操作數不短路(我們沒有足夠的信息尚未),並且Python需要檢查第二個操作數qwer,該值在布爾連續值中計算爲True分機(記住它不是空的),並返回它。