728x90
반응형
- 내부함수
- 함수 안에서 정의 되는 함수
- 클로저(closure)
- 함수가 종료되어도 자원을 사용할 수 있는 함수
- 클로저 조건
- 내부함수
- 외부함수 변수를 참조해야 한다.
- 외부함수가 내부함수를 반환 해야 한다.
def outer(name): # 외부함수
def inner(): # 내부함수
print(name, "하이") # 외부함수 변수 참조
return inner # 내부함수 반환
callfunc = outer("tom")
callfunc()
# OUTPUT
tom 하이
- 클로저 살펴보기
print(dir(callfunc))
# ['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
print(type(callfunc.__closure__))
# <class 'tuple'>
print(callfunc.__closure__[0])
# <cell at 0x00000233CBE8A6E0: str object at 0x00000233CBE93B30>
print(dir(callfunc.__closure__[0]))
# ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'cell_contents']
print(callfunc.__closure__[0].cell_contents)
# tom
- 라인 1: dir 로 callfunc 를 살표보면 __closure__ 가 존재하는것을 볼수 있다.
- 라인 3: __closure__ 의 타입은 tuple 이다.
- 라인 5: __closure__[0] 번째 항목을 출력한 결과이다.
- 라인 7:__closure__[0] 을 dir 로 살펴보면 cell_contents 가 존재하는 것을 볼수 있다.
- 라인 9: cell_contents 를 출력해보면 외부함수 변수의 값인 tom 이 있는것을 확인 할 수 있다.
- 위 코드에서 callfunc = outer("tom") 호출 시점에 외부함수는 종료가 된다. 하지만 종료가 된 후에도 callfunc() 가 외부함수 변수 값인 "tom" 을 출력할 수 있는 이유는 클로저 공간에 변수의 값을 저장하고 있기 때문이다.
728x90
반응형
'Development > Python' 카테고리의 다른 글
파이썬 문법 : 데코레이터 함수 (0) | 2023.03.13 |
---|---|
파이썬 문법 : 제너레이터 함수 (0) | 2023.03.09 |
파이썬 문법 : method (0) | 2023.03.03 |
파이썬 문법 : class 속성들 (0) | 2023.03.02 |
파이썬 문법 : map, filter 함수 (0) | 2023.02.28 |