2015-08-14 48 views
8

PEP 3103中,Guido正在討論爲各種流派,思想,方法和對象添加一個switch/case語句給Python。在他做this statementPEP 3103:開關情況與if語句代碼塊之間的區別

另一種反對意見是,首先使用規則允許混淆代碼 這樣的:

def foo(x, y): 
    switch x: 
    case y: 
     print 42 

爲未經訓練的眼睛(不熟悉Python)這個代碼就相當於對此:

def foo(x, y): 
    if x == y: 
     print 42 

但這不是它所做的(除非總是使用與第二個參數相同的值調用它)。這已經通過暗示不應該允許引用局部變量的情況表達式來解決,但是這有點武斷。

我不會認爲自己沒有受過訓練或不熟悉Python,但是沒有什麼會跳出來,因爲這兩個代碼塊是不同的。

他引用的是什麼使得這兩段代碼在執行過程中有所不同?

回答

10

您需要閱讀該部分開頭處的說明。 「處理這個問題的最古老的建議是在第一次執行切換時凍結調度。」這意味着,中y值將在switch語句第一次運行,被高速緩存,這樣,如果你第一次稱呼其爲:

foo(10,10) 

後續調用,如foo(20,20),實際上將比較:

switch x: 
case 10: 
    print 42 
+0

這是有道理的。我認爲這可能與冷凍詞典的概念有關,但我想我的表態讓任何人都應該注意到表達方式不同。 –