[Python] 연습

[Python] 지역변수, 전역변수, 클로저(Closure)

Simon Yoon 2022. 5. 28. 21:33
  • 지역변수와 전역변수
    • 지역변수(local variable): 함수 안에서 선언되는 변수
    • 전역변수(global variable): 함수 외부에서 선언되는 변수
name = 'simon'
def my_name():
    name = 'kihun'
    print(name)

my_name()  # 결과: kihun
print(name)  # 결과: simon

my_name() 함수 내부에서 선언된 name변수는 함수를 호출하였을때, ‘kihun’이라는 이름을 출력하지만 지역변수이므로 함수 외부에서의 print(name)에는 영향을 미치지 않는다.

print(name) 함수는 전역변수로 선언된 name = ‘simon’의 ‘simon’을 출력하고 있다.

 

만약, 함수 내부에서 선언된 name 변수가 전역변수로 사용되기 위해서는 global 키워드를 작성하여 전역변수로 사용할 수 있다.

def my_name():
    global name  # 전역변수로 사용
    name = 'simon'

my_name()
print(name)

 

아래와 같이 함수를 중첩하여 사용한 경우를 보자. 이때, 함수 c()에서 사용되는 x 변수는 nonlocal로 선언하여 바로 상위 scope의 b() 함수에서 선언된 x = 20에 따라서 연산되었다. 이처럼 globalnonlocal을 사용하여 scope에 따라 변수를 사용할 수 있다.

def a():
    x = 10
    y = 100
    def b():
        x = 20
        def c():
            nonlocal x
            nonlocal y
            x = x + 30
            y = y + 300
            print(x)
            print(y)
        c()
    b()
a()

# 결과
# 50
# 400

추가) 인스턴스 변수(instance variable): 클래스 안에서 선언되는 변수로 앞에 self를 사용

 

  • 클로저(Closure): 외부 함수에 접근할 수 있는 내부 함수 혹은 이러한 원리를 말함
    • 함수를 클로저 형태로 만드는 방법
def my_func():
    name = 'simon'
    def hello():
        print('hello,', name)
    return hello

my_func()()  # 결과: hello, simon

 

클로저 형태 예시

def times_multiply(n):
    def multiply(x):
        return n * x
    return multiply

times_3 = times_multiply(3)
times_4 = times_multiply(4)

del times_multiply

print(times_3(5))  # 결과: 15
print(times_4(5))  # 결과: 20

위의 times_3, times_4와 같이 클로저 형태를 사용하여 프로그램의 흐름을 변수에 저장하면 del로 times_multiply() 함수를 삭제해도 사용하고 싶을 때 사용할 수 있게 된다. 또한 클로저 내의 지역변수는 외부에서 직접 접근할 수 없다.

클로저 관련 참고: https://dojang.io/mod/page/view.php?id=2366

'[Python] 연습' 카테고리의 다른 글

[Python] enumerate () 함수  (0) 2022.06.30
Mac에서 Python venv 가상환경 생성  (0) 2022.06.09
[Python] 클래스와 상속  (0) 2022.05.27
[Python] 결측값 처리하기(dropna)  (0) 2022.03.27
[Python] Series  (0) 2022.03.26