ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 스코프 규칙
    언어/파이썬 & 장고 2017. 1. 18. 14:47

    파이썬에는 지역, 전역, 내장 스코프를 지원합니다.

    • 지역 스코프: 함수 내부에서 생성되는 스코프
    • 전역 스코프: 모듈(파이썬 파일) 스코프
    • 내장 스코프: 파이썬 자체 내장 영역 스코프

    각각의 스코프 특성 때문에 변수의 트성도 지역과 전역으로 나뉘어 집니다. 파이썬이 지역과 전역을 선언할 때 전역변수를 선언하거나 명시할 때 global 키워드를 사용해야 합니다.


    def func_scope():
        print(a)
    
    
    a = 100
    func_scope()
     
    # 결과
    # 100

    위의 예제와 같이 전역변수를 참조만 하여 사용할 때 (전역변수의 수정이 일어나지 않을 때)는 global 키워드 없이 그대로 사용할 수 있습니다.


    def func_scope():
        print(a)
        a = 200
        print(a)
    
    a = 100
    func_scope()
    
    # 결과
    # Traceback (most recent call last):
      # File "<string>", line 13, in <module>
      # File "<string>", line 6, in func_scope
    # UnboundLocalError: local variable 'a' referenced before assignment

    위의 예제와 같이 전역(모듈 네임 스페이스) 공간에 있는 변수 a를 func_scope()에서 수정하고자 하면 에러가 발생합니다. 변수 a가 함수 내부의 지역 스코프에 선언되어 있지 않기 때문에 값을 변경할 수 없습니다.


    위와 같이 참조만 하면 사용할 수 있는데 수정을 하려고하면 에러가 나는 이유는 변경하려는 자료형 타입이 수정할 수 없는 타입이기 때문입니다. 아래의 코드처럼 수정할 수 있는 타입을 전역에 선언하고 값을 수정한다면 에러없이 실행됨을 볼 수 있습니다.

    def func_scope():
        print(a)
        a['key'] = 'value'
    
    
    a = {}
    func_scope()
    print(a)
    
    #결과
    # {}
    # {'key': 'value'}


    만약 전역 네임스페이스에 선언된 변수가 변경할 수 없는 타입이라면 global 키워드를 앞에 붙여 해당 변수가 전역 네임스페이스에 있다는 것을 알려야 합니다.

    def func_scope():
        global a
        print(a)
        a = 200
        print(a)
    
    
    a = 100
    func_scope()
    
    
    # 결과
    # 100
    # 200


    댓글