2017-02-28 219 views
-5

爲什麼(1+1) and 1返回1而不是2爲什麼(1 + 1)和1返回1而不是2?

爲什麼1/0 or True評估爲錯誤,而不是True

+0

請給出一個具體的做法,發生這種情況 – We0

+0

http:// cs61a。org/lab/lab01/ –

+0

要求人們爲你做功課不是很酷 –

回答

5

您的第一個結果歸因於short-circuit evaluation。下面是Python的計算表達式:

  1. 減少(1 + 1)2

  2. 在布爾上下文中考慮2"truthy"

  3. 評估並返回and的右側操作數。

請注意,如果左操作數是「虛假」,它將立即返回,並且Python不會試圖評估右手操作數。

順便說一句,or以類似的方式工作:它返回左手操作數,如果它是「truthy」,如果不是,則返回右操作數。

注意,在任何情況下做andor以往自主決定返回TrueFalse或任意數值轉換爲或TrueFalse。它總是返回的兩個操作數中的一個(除非程序崩潰 - 請參見下文),無論它們是否爲bool

你的第二個結果只是一個除零誤差。像大多數語言一樣,Python將零除作爲錯誤,因爲實數的數學結果爲undefined。只要Python試圖評估1/0,程序就會崩潰,一切都會停止 - Python從來沒有機會看到右手操作數。

然而,上述因短路行爲,下面的表達式:

True or 1/0 

評估爲True即使1/0會導致錯誤,因爲Python從不試圖同時評估右手操作所有在這種情況下。

+0

但1/0或True返回錯誤根據上面的註釋python應該給返回true,因爲在1或者語句中,如果1/0計算結果爲false,那麼它應該返回true,但是返回錯誤 –

+2

'1/0 ** **不計算爲false。它不計算任何東西,因爲它在字面上毫無意義,因此會引發'ZeroDivisionError'並在執行任何其他事情之前停止執行*。當試圖評估某些事情會導致致命錯誤時,所有投注都將關閉。 –

+0

認識到'1/0'不會「返回」錯誤是很重要的。它**是**錯誤,並導致程序崩潰。 –

4

Hard to argue與解釋器/字節碼:

In [1]: import dis 

In [2]: dis.dis('(1+1) and 1') 
    1   0 LOAD_CONST    1 (2) 
       2 JUMP_IF_FALSE_OR_POP  6 
       4 LOAD_CONST    0 (1) 
     >> 6 RETURN_VALUE 

首先,Python的預編譯1+1至2

然後,它說,「如果該值是一個falsey值,則跳轉到圖6(即,返回) 」。 2顯然不是錯誤的,所以它加載1,這就是結果。