2013-07-01 1 views
0

나는 reading about lambdas (dive into python)이고 예제 코드를 실행했고 텍스트 상태와 다른 결과를 얻었다. 그것은 example 4.21입니다 : 내가 볼 수 있듯이파이썬으로 뛰어 들어라 : 람다 식 : 논리적 인 모호성 제거

>>> collapse = True 
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 
>>> processFunc("this is\na\ttest") 
'this is a test' 
>>> collapse = False 
>>> processFunc("this is\na\ttest") 
'this is a test' 

먼저 람다 표현식은 collapse 값이 아무리에게 반환됩니다

processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 

이 내 평 2.7 콘솔 출력됩니다. 내 생각이나 파이썬 버전이 바뀌 었거나이 전설적인 도서 국가와 다른 결과를 얻었습니다.

답변

6

processFunc다시으로 설정해야합니다.

식을 다시 설정할 때마다 collapse을 다시 계산하지 않습니다. 번만으로 계산됩니다. collapse = False을 실행하면 processFunc이 다른 람다를 가리 키도록 마술처럼 변경되지 않았습니다.

는 단순히 processFunc = 표현을 두 번째 실행 : 당신이 다시 평가 될 processFunc을 예상하는 경우가해야 할 것,

>>> collapse = True 
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 
>>> processFunc("this is\na\ttest") 
'this is a test' 
>>> collapse = False 
>>> processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 
>>> processFunc("this is\na\ttest") 
'this is\na\ttest' 

을 그 자체로 함수 나 람다 :

>>> collapse = True 
>>> processFunc = lambda: collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 
>>> processFunc()("this is\na\ttest") 
'this is a test' 
>>> collapse = False 
>>> processFunc()("this is\na\ttest") 
'this is\na\ttest' 

하지만 이제 processFunc()을 호출하여 lambda 객체를 반환해야합니다. 그러면이 객체를 인수로 호출합니다. processFunc을 호출하면 표현식이 다시 평가되고 collapse 이름이 주변 범위 (이 경우 전역)에서 조회되고 람다 중 하나가 반환됩니다.

+0

aaahh ... 감사합니다. 나는 javascript 클로저와 비슷하게 동작한다고 생각했다. – ducin

+1

@tkoomzaaskz Python 클로저와 lambdas * do *는 javascript 클로저처럼 작동합니다. 그러나, 당신처럼 자바 스크립트에서 작동하지 않을 것으로 보인다. Javascript는 마술처럼 할당 문을 재평가하지 않습니다. – Marcin

+0

@Marcin에서 더 자세히 설명해 주시겠습니까? 나는 여기서'js'와'py'의 차이점을 이해하지 못합니다. 그리고 이것은 중요한 것 같습니다. 미리 감사드립니다. – ducin