변수 scope

행동하는 개발자·2022년 10월 31일
0

PySide, PyQt

목록 보기
19/20

오류의 시작

도대체 이 오류는 무슨 오류인가..

NameError: free variable 'product' referenced before assignment in enclosing scope

정의된 변수를 사용할 수 있는 프로그램 영역을 유효 영역(scope) 라고 부른다. 파이썬에서는 4개의 유효 영역이 존재한다.

1. 지역 변수

함수 안에서 global로 정의되지 않고 변수가 정의되면, 지역 변수라 부르며 지역변수 영역에 저장된다. 저장된 지역 변수들은 locals() 내장 함수로 찾아볼 수 있다.

x = 0                  # 전역 변수

def func():
    x = 1              # 지역 변수
    print("global: x = %d" % globals()['x'])
    print("local : x = %d" % locals()['x'])

func()

결과

global: x = 0
local : x = 1

이렇게 정의된 지역 변수들은 함수 안에서만 사용할 수 있고 함수 밖에서는 사용할 수 없다. 함수 안에 정의된 변수를 함수 밖에서 사용하면, NameError가 발생하게 된다.

2. 바깥 함수 지역 변수 영역

중첩 함수와 같이 바깥 함수가 안쪽 함수를 포함할 수 있으며, 바깥 함수에서 정의된 지역 변수를 안쪽 함수에서 예약어를 사용하여 바깥 함수의 지역 변수를 사용할 수 있다.

x = 0                          # 전역 변수

def outer():
    x = 1                      # 바깥 함수 지역 변수
    #
    def inner():
        x = 2                  # 안쪽 함수 지역 변수
        print("inner :", x)
    #
    inner()
    print("outer :", x)

outer()
print("global:", x)

출력 결과

inner : 2
outer : 1
global: 0

3. 전역 변수 영역

모듈의 최고 높은 수준에서 변수를 정의하면, 함수 안에서 다시 정의하지 않는 한 모든 영역에서 참조할 수 있는 전역 변수 영역에 사전형으로 저장되며 이를 전역 변수라 부른다.

최고 수준에서 정의하지 않고 함수 안에서 global 예약어를 사용하여 전역 변수로 선언하고 값을 넣어도 전역 변수가 된다.

x = 0                          # 전역 변수

def outer():
    x = 1                      # 바깥 함수 지역 변수
    #
    def inner():
        global x               # 전역 변수 선언
        x = 2                  # 전역 변수 사용
        print("inner :", x)
    #
    inner()
    print("outer :", x)

outer()
print("global:", x)

출력 결과

inner : 2
outer : 1
global: 2

함수 안에서 global 예약어를 사용하지 않아도 변수를 참조하면 암시적으로 전역 변수를 참조한다고 간주하여 전역 변수 영역에서 변수를 찾게 된다. 그리고 변수에 값을 넣으면 지역 변수로 바뀌게 되며 앞의 print 문에서 값이 할당되지 않았는데 변수를 사용하였다는 오류가 발생한다.

-> 따라서 첫 오류의 메시지의 그 해석에 따라 나는 함수를 정의하기도 전에 미리 사용하는 오류로 그 에러메시지가 뜬 것이다.

참고 블로그: 감사합니다[https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=msyang59&logNo=220773717531]

profile
끊임없이 뭔가를 남기는 사람

0개의 댓글