2014-03-07 34 views
0

我正在嘗試使用lambdas,以更好地理解它們在遇到此行爲時的工作方式。我想我會讓本身在Python 2.7中破碎的lambda?

>>> import sys 
>>> sys.version 
'2.7.3 (default, Sep 26 2013, 20:03:06) \n[GCC 4.6.3]' 
>>> a = 5; b = 7 
>>> func1 = lambda True: a if True else b 
>>> func1(True) 
5 
>>> func1(False) # <== why? 
7 
>>> func2 = lambda x: a if True else b 
>>> func2(True) 
5 
>>> func2(False) 
5 

代碼講我的職能跑「解散」,這是什麼就出來了:

>>> import dis 
>>> dis.dis(func1) 
    1   0 LOAD_FAST    0 (True) 
       3 POP_JUMP_IF_FALSE  10 
       6 LOAD_GLOBAL    0 (a) 
       9 RETURN_VALUE   
     >> 10 LOAD_GLOBAL    1 (b) 
      13 RETURN_VALUE   
>>> dis.dis(func2) 
    1   0 LOAD_GLOBAL    0 (True) 
       3 POP_JUMP_IF_FALSE  10 
       6 LOAD_GLOBAL    1 (a) 
       9 RETURN_VALUE   
     >> 10 LOAD_GLOBAL    2 (b) 
      13 RETURN_VALUE   

唯一的區別是LOAD_FASTLOAD_GLOBAL

之間

爲什麼func1中的'False'得到評估?

在一個側面說明,3.3不允許這樣的:

>>> import sys 
>>> sys.version 
'3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:19:30) [MSC v.1600 64 bit (AMD64)]' 
>>> a = 5; b = 7 
>>> func = lambda True: a if True else b 
    File "<stdin>", line 1 
    func = lambda True: a if True else b 
        ^
SyntaxError: invalid syntax 
+0

你期待什麼發生? – user2357112

回答

2

TrueFalse在Python 3 keywords,你不能再使用它們作爲一個變量。在Python 2中,它們只是簡單的變量,您可以通過簡單的賦值來覆蓋它們的值。

的Python 2:

>>> True = False 
>>> True 
False 
>>> def f(True): 
...  print True 
...  
>>> f(1)  #assigns 1 to local variable True 
1 
>>> f(False) #assigns False to local variable True 
False 

的Python 3:

>>> True = False 
    File "<ipython-input-2-7cebd69d5d15>", line 1 
SyntaxError: assignment to keyword 
+0

我喜歡這兩個答案,但[@ashwch](http://stackoverflow.com/users/846892/ashwini-chaudhary)用他們的名字叫他們。我認爲'真'和'假'是不可變的物體是多麼的錯誤!我想知道什麼時候Python 3將統治超過2 ... – perrocontodo

4
func1 = lambda True: a if True else b 

在這裏,你命名你的拉姆達的說法True。這意味着身體中的True指的是爭論,無論發生什麼。這大致相當於

def func1(x): 
    return a if x else b 

在另一方面,

func2 = lambda x: a if True else b 

這裏,參數有一個更合理的名字,所以True指的是內置變量。它大致相當於

def func2(x): 
    return a if True else b 

在Python 3中,您不能再命名變量True