[파이썬] 클로저와 자유 변수
클로저(closure)는 함수와 그 함수가 정의된 환경을 함께 저장한 객체입니다. 클로저를 사용하면 함수가 자신을 둘러싼 환경에 있는 변수를 계속 사용할 수 있습니다. 이러한 변수를 자유 변수(free variables)라고도 합니다.
파이썬에서 클로저와 자유 변수를 사용하는 방법을 알아보겠습니다.
클로저 생성하기
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
print(closure(20)) # Output: 30
위의 코드에서 outer_function
은 inner_function
을 반환합니다. inner_function
은 x
와 y
두 개의 매개변수를 가지고 x + y
를 반환합니다. 이때 inner_function
에서 x
는 클로저에 의해 자유 변수로 사용됩니다.
자유 변수 사용하기
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(100)
print(closure(20)) # Output: 120
closure.__closure__[0].cell_contents = 50
print(closure(20)) # Output: 70
위의 코드에서 closure.__closure__[0].cell_contents
를 통해 클로저에 저장된 자유 변수 x
의 값을 변경할 수 있습니다. 이는 클로저가 자유 변수에 대한 참조를 유지하기 때문입니다. 따라서 closure(20)
을 호출할 때 x
의 값이 50으로 변경되어 결과가 70이 되는 것을 확인할 수 있습니다.
주의 사항
클로저와 자유 변수를 사용할 때 주의해야 할 몇 가지 사항이 있습니다.
- 클로저는 자유 변수에 대한 참조를 유지하기 때문에 메모리 누수가 발생할 수 있습니다. 클로저를 사용하는 경우에는 메모리 사용에 주의해야 합니다.
- 클로저를 사용할 때는 자유 변수의 값이 변경되는 경우에 대해 예상할 수 있어야 합니다. 클로저를 반환한 이후에 자유 변수의 값이 변경될 수 있다는 점을 염두에 두어야 합니다.
클로저와 자유 변수는 파이썬에서 강력하고 유용한 개념입니다. 적절히 활용하여 코드의 재사용성과 유연성을 높일 수 있습니다. 그러나 사용 시 주의사항을 잘 숙지해야 원치않은 결과나 메모리 누수를 방지할 수 있습니다.