예시 1) 전역변수는 어떤 영역에서도 접근 가능
x=100
print(x)
# 100
# 전역변수 x는 어떤 영역에서든 접근 가능
def func():
print(x)
func()
# 100
# 전역변수 x는 어떤 영역에서든 접근 가능
x는 전역변수 --> 어느 영역에서나 접근 가능함
func()에 정의된 x라는 변수가 없으므로 global 변수인 x를 사용함
예시 2) 지역변수는 함수 내에서만 접근 가능
def func():
y=1000
print(y)
func()
# 1000
# 함수 내에서 y 변수에 접근 가능
print(y)
# NameError: name 'y' is not defined
# 지역변수는 해당 함수 내에서만 접근 가능
여기서 y 변수는 func 함수 내에서 정의된 지역 변수
--> 따라서 func 함수 내에서만 접근 가능
예시 3 ) 지역변수와 전역변수가 같은 이름일 때
x=100
def func():
x= 5000
print(x)
func()
# 5000
# 함수 내에 있는 x를 print
print(x)
# 100
# global 변수인 x를 print
지역변수와 전역변수가 같은 이름일 때
함수 내에서는 지역변수를 우선적으로 사용
아래의 예시처럼 함수 밖에서 전역변수 수정이 가능
x=10
x=x+1
print(x)
# 11
함수 내에서 전역변수에 접근하는 것이 가능함
그러나 아래의 예시처럼 함수 내에서 전역변수 수정은 불가능
x=10
def func():
x=x+1
print(x)
func()
# UnboundLocalError: local variable 'x' referenced before assignment
그렇다면 전역변수를 수정해야할 때 사용할 수 있는 방법은? global 키워드 이용하기
함수 내에서 범위 밖에 있는 전역변수를 수정할 수 있게하는 키워드
사용방법 : global 변수명
x=10
def func():
global x # global keyword 사용
x=x+1 # 전역변수 수정됨
print(x)
func()
# 11
print(x)
# 11
전역변수를 많이 사용하면 변수 사이에 충돌이 발생할 수 있는 등의 단점이 있음
따라서 전역변수 사용을 최소화 하는 것이 좋음
--> global 키워드 역시 사용을 최소화 하는 것이 좋음
지역변수는 함수 내에서 수정가능
함수 외부에서는 지역변수 이용 불가능 (이용 불가능해서 수정도 불가능)
어떠한 객체(변수, 함수 등)가 유효한 범위
함수 내에서 선언된 변수가 가지고 있는 범위
중첩함수가 있을 때 적용되는 범위
outer의 안에 있되 inner의 밖에 있는 영역
ex) outer 함수에 있는 변수 y는 inner 함수 입장에서는 nonlocal scope에 있는 변수
전역변수가 가지는 유효범위
전역변수가 선언된 지점 아래부터 global scope
위의 그림들 중 회색범위가 global scope
가장 광범위한 scope
파이썬 내장함수 또는 속성들이 built-in scope를 가지고 있음
built-in scope는 따로 선언이 없어도 모든 파이썬 파일에서 유효한 범위를 가지고 있음
ex) len( ), sum( ) 등 파이썬의 내장함수
예시 1)
x=1
def outer():
y=100
def inner():
return y # nonlocal 범위에 있는 변수에 접근
return inner
func2=outer()
print(func2())
# 100
예시 2 )
x=1
def outer():
y=100
def inner():
y=y+1 # nonlocal 범위의 변수 수정 불가능
return y
return inner
func2=outer()
print(func2())
# UnboundLocalError: local variable 'y' referenced before assignment
위의 예시 2를 보면 inner 함수에서 nonlocal 범위에 있는 변수는 수정이 불가능 했음
이를 수정하기 위해서 nonlocal keyword 이용
x=1
def outer():
y=100
def inner():
nonlocal y # nonlocal keyword 사용
y=y+1
return y
return inner
func2=outer()
print(func2())
# 101
위와 같이 nonlocal keyword를 이용하면 nonlocal 범위에 있는 변수를 수정할 수 있음
ref) https://shoark7.github.io/programming/python/closure-in-python#2c