[파이썬] 클로저와 자유 변수

클로저(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_functioninner_function을 반환합니다. inner_functionxy 두 개의 매개변수를 가지고 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이 되는 것을 확인할 수 있습니다.

주의 사항

클로저와 자유 변수를 사용할 때 주의해야 할 몇 가지 사항이 있습니다.

  1. 클로저는 자유 변수에 대한 참조를 유지하기 때문에 메모리 누수가 발생할 수 있습니다. 클로저를 사용하는 경우에는 메모리 사용에 주의해야 합니다.
  2. 클로저를 사용할 때는 자유 변수의 값이 변경되는 경우에 대해 예상할 수 있어야 합니다. 클로저를 반환한 이후에 자유 변수의 값이 변경될 수 있다는 점을 염두에 두어야 합니다.

클로저와 자유 변수는 파이썬에서 강력하고 유용한 개념입니다. 적절히 활용하여 코드의 재사용성과 유연성을 높일 수 있습니다. 그러나 사용 시 주의사항을 잘 숙지해야 원치않은 결과나 메모리 누수를 방지할 수 있습니다.