lambda scope capture 주의할 점
2021. 9. 10. 14:08
C++ lambda는 [ ]로 캡처할 변수, 참조/복사 방식의 캡처를 지정해줄 수 있다.
그럼 파이썬의 경우엔? 별다르게 지정해주는게 없는데
한줄 요약 : lambda는 호출 시에 evaluate되며, 모르는 변수는 outer scope에서 참조한다.
그래서, 람다 선언에 일단 넣어두고, 나중에 그 변수를 정의한 뒤 람다를 호출하는 것이 가능하다.
squares = []
for x in range(5):
squares.append(lambda: x ** 2)
print(squares[2]()) # 16
print(squares[4]()) # 16
x = 8
print(squares[2]()) # 64 (람다의 x가 8을 참조)
Q. 바깥 변수 capture하는 scope는?
> The expression inside a lambda is evaluated when the function is called, not when it is defined.
https://stackoverflow.com/questions/22335171/in-python-why-can-a-lambda-expression-refer-to-the-variable-being-defined-but-n
즉, 호출될때 바깥 참조
ex = lambda n: n*multiplier
...
multiplier = 3
print(ex(5)) # 15
print(ex(10)) # 30
이것도 읽어보기 (loop예시)
https://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture
'<언어> > [Python]' 카테고리의 다른 글
[Python] 메모리 관리 (memory allocation) (0) | 2022.01.26 |
---|---|
argparse로 CLI argument, flag 구현 (0) | 2021.11.12 |
[Generator] yield, yield from (0) | 2021.08.24 |
[Tesseract][OpenCV] 코드 이미지 OCR + 자동 indent (0) | 2021.07.10 |
데코레이터 + @lru_cache 데코레이터를 활용한 DP 캐싱 (0) | 2021.06.03 |