georgesi的回答完全回答了您提出的具體問題 - 但您鏈接的文檔也是如此,因爲他只是從這些文檔引用。所以,想必你想要更多。
你可能會問兩兩件事:
- 爲什麼是Python的設計成這樣,當我的家鄉直覺/最喜歡的語言說:
or
應該返回bool
?
- 如何這樣做Python工具?
既然你粗體的問題「真的會發生後面的Python or
操作什麼」,我猜是後者。
請記住,Python有多種實現方式,只要符合參考文檔設置的規範,他們可以自由實現所需的任何內容。但通常,當人們問「Python如何做到這一點?」時他們的意思是「CPython實現如何做到這一點?」
首先,讓我們來看看一些字節碼:
>>> def f():
... return 1 or 2
>>> import dis
>>> dis.dis(f)
2 0 LOAD_CONST 1 (1)
3 JUMP_IF_TRUE_OR_POP 9
6 LOAD_CONST 2 (2)
>> 9 RETURN_VALUE
這是什麼意思?在Python式的僞代碼是這樣的:
top = 1
if top:
goto 9
else:
del top
top = 2
label 9
return top
如果你想更好地瞭解(和CPython的是你所關心的實現),你只需要知道,CPython的字節碼解釋器是一個簡單的堆棧機,並且該堆棧機器的代碼位於文件ceval.c
內。所以,我們可以找到JUMP_IF_TRUE_OR_POP
代碼here。 (LOAD_CONST
操作碼只是將恆定值推入堆棧,以便w = TOP()
可以找到它們。我不認爲我們真的需要深入瞭解or
的工作原理。)
您可以看到它有點複雜。
主要這是因爲它通過調用bool(top)
的C-API相當於之前檢查if top == False
和if top == True
優化if top
一部分,因爲它處理從bool
通話例外。但它也在優化堆棧使用。在沒有解釋DISPATCH
和FAST_DISPATCH
是如何工作的情況下,很難做到太精確,但基本的想法是,它避免了彈出堆棧中的值,以便將它們推回來。
但這就是「Python or
操作背後真正發生了什麼?」
您還加粗「是不是or
假設產生True
或False
只?」所以,這使我們回到問題1
首先,請記住,鴨打字是非常核心蟒蛇。 or
是應該產生的東西,可以使用,就好像它是重要的任何地方的True
或False
。你特別應該寫if foo:
而不是if foo == True:
(或if foo is True:
或if foo != False:
或其他),所以你不應該關心它們之間的區別。
其次,大約有一半的語言與您認爲「布爾操作」應嚴格返回布爾類型值,而其中一半不同意。即使在那些不是以鴨子打字爲基礎的語言中,比如C語言,那麼語言設計師怎麼決定呢?
使得or
運算符總是返回bool
的「C++風格」避免了副本,允許編譯器更好地執行靜態類型,併爲程序員提供更好的動態類型信息。前兩個在Python中完全不相關,最後一個通常只在編寫依賴於類型的代碼時纔有用,而不是duck typing,通常認爲它是unpythonic。
使其返回第一個真值(或最後一個falsy值)的「C風格」使得實現起來稍微簡單一些,併爲程序員提供了三元式表達式的簡寫。
當Python沒有三元組if
- else
時,這個調用更容易。現在,也許這是一個更接近的電話 - 尤其是因爲有些人討厭a or b
作爲a if a else b
的簡寫,並認爲它不合理。
但是歷史已經在那裏了;除非有令人信服的理由,否則任何事情都不會改變,而根據您的口味可能會有相反方向的緊密呼叫並不是一個令人信服的理由。
鏈接到的文檔解釋了它是如何工作的。 – BrenBarn 2013-03-14 18:36:40
'或'會返回第一個表達式,如果第一個表達式是真的,第二個表達式是假的。 – 2013-03-14 18:36:50
如果你想返回布爾值,你可以使用'bool(x或y)' – Akavall 2013-03-14 18:45:13