2014-03-07 6 views
0

나는이 동작에 부딪쳤을 때 어떻게 작동하는지 더 잘 이해하기 위해 람다 (lambda)로 뭔가를 시도하고있었습니다. 나는 내가 기능에 '창피'를 실행 한 코드 자체파이썬 2.7에서 깨진 람다?

>>> 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 

을 대변하게됩니다 추측이 나온 것입니다 : 유일한 차이점은 LOAD_FASTLOAD_GLOBAL

사이

>>> 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   

func1의 '거짓'이 전혀 평가되지 않는 이유는 무엇입니까? 보조 노트에

, 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 파이썬 3 keywords을, 당신은 더 이상 변수로 사용할 수 없습니다. 그리고 Python 2에서는 단순 변수 일 뿐이므로 간단한 할당으로 값을 무시할 수 있습니다.

파이썬 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 

파이썬 3 : 여기

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

두 답이 모두 좋아했지만 [@ashwch] (http://stackoverflow.com/users/846892/ashwini-chaudhary)는 이름으로 불렀습니다. 'True'와 'False'가 불변의 객체라고 생각하는 것이 얼마나 틀린 지요! 파이썬 3이 2를 통치 할 때 나는 궁금해. – perrocontodo

4
func1 = lambda True: a if True else b 

, 당신은 당신의 람다의 주장 True을 지명했다. 즉, 본문에있는 True은 그 어떤 일이 일어 났는지에 대한 논쟁을 의미합니다. 너무 True가 내장 된 변수를 참조, 인수가 더 적절한 이름이 여기에,

func2 = lambda x: a if True else b 

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

거의 비슷합니다. 그것은 파이썬 3에서

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

거의 비슷, 당신은 더 이상 변수 True의 이름을 수 있습니다.