먼저 위키백과의 내용을 보면 아래와 같습니다.
컴퓨터 프로그래밍에서 변수 영역은 변수가 유효성을 갖는 영역을 가리킨다. 프로그램은 영역을 벗어난 변수를 가리킬 수 없다.
변수의 영역을 지정하는 규칙은 크게 정적 영역 규칙과 동적 영역 규칙으로 나뉜다. 정적 영역 규칙을 따르는 언어에서는 변수의 유효 영역이
컴파일 타임
에 결정되며, 동적 영역 규칙은실행 시간
에 결정된다. 대부분의 현대 언어는 정적 영역 규칙을 따른다.“위키백과 - 변수 영역”
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_var
을 child_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