ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 지역변수와 전역변수 in Python
    Python 2021. 7. 6. 15:51
    반응형

     

    C언어 계열 혹은 Java에서는 메소드 상위에 변수를 선언하고 메소드 안에서 사용하면 자동으로 해당 이름의 변수가 매칭되어 사용된다. 하지만 Python은 조금 다르다.

    a = 0
    def func():
        a += 1
    
    func()
    print(a)
    
    # UnboundLocalError: local variable 'a' referenced before assignment

    위와 같은 코드를 실행하면 다음과 같은 에러가 발생한다.

    UnboundLocalError: local variable 'a' referenced before assignment

    local 변수인 a가 할당되기 전에 참조되었다고 한다. 분명히 상단에서 a를 선언했건만 어째서 해당 에러가 발생하는 것일까? 이제 밑의 코드를 확인해보자.

    a = 0 # 선언 1
    def func():
        a = 0 # 선언 2
        a += 1
    
    func()
    print(a)
    
    # 0

    일단 에러는 발생하지 않는다. 하지만 의도했던 1이 아닌 0이 출력되는 것을 볼 수 있다. 바로 선언 1에서의 a와 선언 2에서의 a가 다른 변수로 인식되기 때문이다. 쉽게 생각해 함수 상단에 변수를 선언하더라도 이 변수는 지역변수로 할당된다 라고 할 수 있다. 하지만 Python에서도 전역 변수를 사용하는 방법이 없는 것은 아니다. 이때 사용하는 키워드가 global이다.

    1. global 변수

    a = 0
    def func():
        global a
        a += 1
    
    func()
    print(a)
    
    # 1

    이렇게 함수 안에서 global 변수를 사용하겠다고 설정하면 함수에서 사용하는 a와 바깥에서 선언한 a는 같은 변수가 인식된다. 이러한 구조는 단일 변수가 아닌 리스트 형태에서도 통용된다. 하지만 append와 같은 리스트의 내부 함수의 경우 global 선언 없이 함수 내부에서 사용이 가능하다.

    2. nonlocal 변수

    전역변수가 아닌 함수 A 내부에서 변수를 선언하고 이를 함수 A의 내부 함수인 B 함수에서 사용을 할 경우에는 global을 활용할 수 없다. 

    def func_a():
        a = 0
        def func_b():
            global a
            a += 1
        func_b()
        return a
    
    print(func_a())
    
    # 0

    이렇게 global을 활용해도 애초에 함수 안에서 사용된 변수 a이기에 global이 적용되지 않으며 이때 사용하게 되는 키워드가 nonlocal이다. 이 키워드는 변수를 바로 위의 부모 함수에서 선언한 변수로 매칭해준다. 

    def func_a():
        a = 0
        def func_b():
            nonlocal a
            a += 1
        func_b()
        return a
    
    print(func_a())
    
    # 1

    nonlocal은 바로 위에 해당하는 a함수의 지역변수에 영향은 주지만 전역변수까지 영향을 미치지는 못한다.

    반응형
Designed by Tistory.