2010-02-19 4 views
4

파이썬에서 람다 식, 클로저 및 범위 지정에 대한 내 머리를 얻으려고합니다. 왜 프로그램이 첫 번째 줄에서 충돌하지 않습니까? 당신이 그것을 호출 할 때까지파이썬 람다 동작

>>> foo = lambda x: x + a 
>>> foo(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
NameError: global name 'a' is not defined 
>>> a = 5 
>>> foo(2) 
7 
>>> 

답변

6

파이썬 기능이 작동하지 않기 때문에. 람다에게는 특별하지 않습니다. :

>>> def foo(x): 
... return x + a 
>>> foo 
<function foo at 0xb7dde454> 
>>> foo(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo 
NameError: global name 'a' is not defined 

변수는 함수가 정의 된 때가 아니라 사용되었을 때 조회됩니다. 그들은 심지어 함수가 호출 될 때마다 찾아 보았습니다. C 백그라운드 (예를 들어)에서 오는 경우에는 예상치 못한 결과를 볼 수 있습니다. 그러나 이것은 Python에서는 문제가되지 않습니다.

2

귀하의 람다 표현식이 평가되지 않습니다.

구문 분석이 발생하여 구문 오류로 인해 추적이 발생합니다.

>>> foo = lambda x : x + a 
>>> bar = lambda y : print y 
SyntaxError: invalid syntax 
0

파이썬에서 lambda (및 def로 정의 된 함수) 본문은 호출 될 때까지 평가되지 않습니다. 이름은 항상 런타임시 조회됩니다.

0

첫 번째 줄에 표현식을 만들면 평가와 다릅니다. 그것을 평가하려 할 때 이것은 기호 a를 찾을 수 없습니다.

2

파이썬의 변수는 설정하기 전에 사용할 수 있습니다. 이렇게하면 구문 오류가 아닌 런타임 오류가 생성됩니다. 여기에서 로컬 변수를 사용하는 예이다 :

>>> def f(): 
...  return a 
...  a = 3 
... 
>>> f() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in f 
UnboundLocalError: local variable 'a' referenced before assignment 

이 미사용 또는 변수 정의를 구문 오류 역 참조 고려 언어 대조적이다. 파이썬은 어휘 범위의 현재 상태를 "포착"하지 않으며, 변경 가능한 어휘 범위에 대한 참조 만 사용합니다. 데모는 다음과 같습니다.

>>> def f(): return a 
... 
>>> f() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in f 
NameError: global name 'a' is not defined 
>>> a = 3 
>>> f() 
3