먼저 위키백과의 내용을 보면 아래와 같습니다.

컴퓨터 프로그래밍에서 변수 영역은 변수가 유효성을 갖는 영역을 가리킨다. 프로그램은 영역을 벗어난 변수를 가리킬 수 없다.

변수의 영역을 지정하는 규칙은 크게 정적 영역 규칙동적 영역 규칙으로 나뉜다. 정적 영역 규칙을 따르는 언어에서는 변수의 유효 영역이 컴파일 타임에 결정되며, 동적 영역 규칙은 실행 시간에 결정된다. 대부분의 현대 언어는 정적 영역 규칙을 따른다.

“위키백과 - 변수 영역

1. 전역

소스 코드 상의 모든 곳에서 사용할 수 있는 전역 변수이다. 대부분의 언어에서 나쁜 습관으로 취급되는 전역 변수지만, 함수명이나 클래스명은 대부분 전역에서 접근할 수 있습니다.

namespace를 사용하면 전역 영역에서 변수나 함수명이 충돌하는 것을 막을 수 있습니다.

  • Python에서는 함수 안에서 상위 범위(Scope)의 변수를 사용하기 위해서 global , nonlocal 키워드를 사용합니다.
  • global은 전역
  • nonlocal은 상위 함수

[global - 예시 코드]

global_var = 'global'

def test_func():
    global global_var
    global_var += ' local'

global_var += ' end'
test_func()
print(global_var)
---------------------------------------------------
'global end local'

[nonlocal - 예시 코드]

def parents_func():
    local_var = 'local'

    def child_func():
        nonlocal local_var
        local_var += ' child'

    child_func()
    print(local_var)
parents_func()
---------------------------------------------------
'local child'

2. 모듈 영역

Python과 같이 모듈을 지원하는 프로그래밍 언어에서는 모듈 단위 변수를 선언할 수 있습니다. 모듈 밖에서는 변수를 볼 수 없습니다.

3. 파일 영역

C와 C++ 및 그 유사 언어에서만 지원하는 개념입니다. 파일 영역은 보다 원시적인 형태의 모듈 영역이라고 할 수 있습니다.

4. 함수 영역

거의 모든의 프로그래밍 언어는 함수 내에서만 유효한 지역 변수를 제공합니다. 함수안에 지역 변수는 함수가 반환되면 더 이상 사용할 수 없습니다.

[예시 코드]

def parents_func():
    local_var = 'local'

def child_func():
    print(local_var)

child_func()
---------------------------------------------------
NameError: name 'local_var' is not defined

parents_func() 함수의 영역에 있는 변수 local_varchild_func() 함수 영역에서 접근하면 선언되지 않았다는 에러가 발생합니다.

5. 블록 영역

코드 블록(if, for, try, catch 등) 영역에서만 유효한 지역 변수입니다.

[예시 코드]

for (let i=0; i<10; i++){
    // somthing code
}

위 코드에서 i 는 for 반복문 안에서만 접근이 가능합니다.

6. 표현식 영역

특정 표현식 안에서만 유효한 지역 변수입니다.
대부분의 함수형 프로그래밍 언어는 let 키워드를 지원합니다.
간단하게 Javascript의 예시를 보면 아래와 같습니다.

[예시 코드]

test = lambda x : x + 1
print(test(1))
print(x)
---------------------------------------------------
2
NameError: name 'x' is not defined

변수 x는 표현식 안에서만 접근 가능하기 때문에 에러가 발생합니다.

📌 Python은 변수를 찾는 스코프에 LEGB 규칙을 따른다고 한다.
Local -> Enclosing -> Global -> Built-in