2017-10-09 18 views
1

누군가 람다 함수를 만들고 싶다고 가정하고, 입력 인수를 제외하고 람다 함수의 모든 것을 함수의 로컬 변수처럼 취급하려고합니다. 그들은 어떻게 그것을 성취 할 것인가? 변수가 "로컬"이라고 말하면, 나는 람다 함수 밖에서 변수에 접근 할 수 없다는 것을 의미합니다.lamda 함수의 지역 변수가 파이썬에서 변경되는 것을 방지하려면 어떻게해야합니까?

코드

right = 5 

demo_lamb = lambda left : print("INSIDE LAMB left == ", left, ",", "right == ", right) 

for lt in range(0, 5): 
    demo_lamb(lt) 
    right = 100*lt + 99 
    print("OUTSIDE LAMB    right == ", right) 

인쇄 출력

INSIDE LAMB left == 0 , right == 5 
OUTSIDE LAMB    right == 99 
INSIDE LAMB left == 1 , right == 99 
OUTSIDE LAMB    right == 199 
INSIDE LAMB left == 2 , right == 199 
OUTSIDE LAMB    right == 299 
INSIDE LAMB left == 3 , right == 299 
OUTSIDE LAMB    right == 399 
INSIDE LAMB left == 4 , right == 399 
OUTSIDE LAMB    right == 499  

원하는 출력 우리는 람다 함수의 내부의 모든 변수의 값을 "동결"어떻게

INSIDE LAMB left == 0 , right == 5 
OUTSIDE LAMB    right == 99 
INSIDE LAMB left == 1 , right == 5 
OUTSIDE LAMB    right == 199 
INSIDE LAMB left == 2 , right == 5 
OUTSIDE LAMB    right == 299 
INSIDE LAMB left == 3 , right == 5 
OUTSIDE LAMB    right == 399 
INSIDE LAMB left == 4 , right == 5 
OUTSIDE LAMB    right == 499 

(제외 입력 인자)를 람다 함수가 만들어 졌을 때의 함수로 만들었습니까? copy 반입 및 copy.deepcopy(right)와 람다 함수 내 right 교체

해결 실패

하나는 어떠한 출력에 아무런 차이가 없다.

+0

변수를 람다 함수에 바인딩해야합니다. –

+2

'some_var = lambda '을 사용하고 있다면, 처음에는'lambda'를 사용하면 안되며,'lambda'는 익명 성임 ** 유일한 이점 **을 무효로합니다. –

+0

그리고 문제는'right'가 지역 변수가 아니라 함수 위에 닫힌 * 자유 변수입니다. 문제는 파이썬이 어휘 범위를 가지고 있기 때문에,'right'는 항상 전역 범위에서'right'를 가리 킵니다. 가장 좋은 방법은 그것을 매개 변수로 만드는 것입니다. 또한,이 함수는'lambda' 함수와 아무 관련이 없습니다. ** 모든 함수는 이런 식으로 작동합니다 ** –

답변

1

전혀 폐쇄의 도입 이전에 날짜 일반적인 트릭은, 사용하는 "선택적 매개 변수"하는 것입니다

demo_lamb = lambda left, right=right: print("INSIDE LAMB left == ", left, ",", "right == ", right) 

기본 인수는 함수가 정확하게 당신이 원하는 무엇인가하는 정의 될 때 평가 .