클로저(Closure)
클로저는 scope에 제약을 받지 않는 변수들을 포함하고 있는 코드 블럭입니다.
클로저를 사용해서 함수 내에서 선언한 지역변수를 함수 밖에서 사용할 수 있습니다.
def outer():
count=0
def inner():
nonlocal count #수준이 out 함수의 수준이 되므로 밑에서 out을 했을때 잘 실행이 된다.
count+=1
return count
return inner #내부 함수의 주소를 반환-클로저 <function outer.<locals>.inner at 0x000001EDA120DBC0>
var1=outer()
print(var1)
print(var1())
print(var1())
print(var1())
print(var1())
print()
var2=outer()
print(var2())
print(var2())
print(id(var1),' ',id(var2))
->두 변수의 주소가 다르기에 값은 새로 생성이 된다.
<function outer.<locals>.inner at 0x00000215892CE020>
1
2
3
4
1
2
2291518988320 2291518988480
코드의 실행결과
만약 코드에서
클로저를 사용하지 않은 경우에는,
out() 함수 내부의 count 변수를 함수 외부에서 사용하려고 하면 에러가 발생합니다.
클로저를 사용한 경우는,
outer() 함수가 내부 함수 inner()의 주소를 반환합니다. 이때 inner() 함수는 count 변수를 참조할 수 있습니다.
반환된 주소를 변수에 할당하고 호출하면, count가 계속해서 증가됩니다.