외부에서 호출된 함수 변수값, 상태(레퍼런스) 복사 후 저장 → 후에 접근(엑서스) 가능
# Clouser 사용
def closure_ex1(): # 함수 결과 반환
# Free variable 자유 변수
seriese = []
def averager(v):
seriese.append(v)
print('inner >> {} / {}'.format(seriese, len(seriese)))
return sum(seriese) / len(seriese)
return averager
avg_clouser1 = closure_ex1()
print(avg_clouser1)
print(avg_clouser1(10))
print(avg_clouser1(30))
print(avg_clouser1(50))
# function ispaction
print(dir(avg_clouser1))
print(dir(avg_clouser1.__code__))
print(avg_clouser1.__code__.co_freevars)
print(avg_clouser1.__closure__[0].cell_contents) # [10, 30, 50]
# 잘못된 클로저 사용
def closuer_ex2():
# free varialbe
cnt = 0
total = 0
def averager(v):
cnt += 1
total += v
return total / v
return averager
avg_clouser2 = closuer_ex2()
# print(avg_clouser2(10)) 에러가 발생합니다.
def closuer_ex3():
# free varialbe
cnt = 0
total = 0
def averager(v):
nonlocal cnt, total
cnt += 1
total += v
return total / cnt
return averager
avg_clouser3 = closuer_ex3()
print(avg_clouser3(15))
print(avg_clouser3(35))
print(avg_clouser3(40))
<aside> 💡 global 함수를 많이 쓰는 건 권장하지 않는다.
</aside>