variable
global
- 전역변수
- 어떤 영역에서도 접근할 수 있음
- 함수 밖에서 정의된 변수
- 사용을 최소화 하는 것이 좋음
local
- 지역변수
- 정해진 영역에서만 접근 가능
- 함수 내에서 정의된 변수
- 해당 함수 내에서만 사용할 수 있음
변수에 접근하기
예시 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 키워드
함수 내에서 범위 밖에 있는 전역변수를 수정할 수 있게하는 키워드
사용방법 : global 변수명
x=10
def func():
global x # global keyword 사용
x=x+1 # 전역변수 수정됨
print (x)
func()
# 11
print (x)
# 11
전역변수를 많이 사용하면 변수 사이에 충돌이 발생할 수 있는 등의 단점이 있음
따라서 전역변수 사용을 최소화 하는 것이 좋음
--> global 키워드 역시 사용을 최소화 하는 것이 좋음
지역변수 수정
지역변수는 함수 내에서 수정가능
함수 외부에서는 지역변수 이용 불가능 (이용 불가능해서 수정도 불가능)
요약
- 전역변수는 함수 내에서 수정이 불가능함 (global 키워드를 쓰면 수정 가능)
- 함수 내에서 전역변수를 수정하고 싶으면 global 키워드 이용
- 지역변수는 함수 내에서 수정 가능
scope
어떠한 객체(변수, 함수 등)가 유효한 범위
- Local Scope
- Enclosed Scope (Nonlocal scope)
- Global Scope
- Built-in Scope

Local Scope
함수 내에서 선언된 변수가 가지고 있는 범위

- 하늘색 부분 : 변수 y의 local scope
- 회색 부분 : 전역변수인 x의 global scope
Nonlocal Scope
중첩함수가 있을 때 적용되는 범위
outer의 안에 있되 inner의 밖에 있는 영역

- 회색 부분 : 변수 x의 global scope
- 하늘색 부분 : inner 함수에 있는 변수 z의 local scope
- 분홍색 부분 : outer 함수에 있는 변수 y의 local scope / Nonlocal scope
ex) outer 함수에 있는 변수 y는 inner 함수 입장에서는 nonlocal scope에 있는 변수
Global Scope
전역변수가 가지는 유효범위
전역변수가 선언된 지점 아래부터 global scope
위의 그림들 중 회색범위가 global scope
Built-in Scope
가장 광범위한 scope
파이썬 내장함수 또는 속성들이 built-in scope를 가지고 있음
built-in scope는 따로 선언이 없어도 모든 파이썬 파일에서 유효한 범위를 가지고 있음
ex) len( ), sum( ) 등 파이썬의 내장함수
Nonlocal keyword
- inner 함수에서 nonlocal 범위에 있는 변수에 접근 가능
예시 1)
x=1
def outer():
y=100
def inner():
return y # nonlocal 범위에 있는 변수에 접근
return inner
func2=outer()
print (func2())
# 100
- inner 함수에서 nonlocal 범위에 있는 변수 수정 불가
예시 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
nonlocal keyword
위의 예시 2를 보면 inner 함수에서 nonlocal 범위에 있는 변수는 수정이 불가능 했음
이를 수정하기 위해서 nonlocal keyword 이용
사용방법 : nonlocal 변수이름
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
'python > Today I Learned' 카테고리의 다른 글
Modules & Packages_1 (0) | 2020.04.04 |
---|---|
Class (2) | 2020.03.31 |
Closure & Decorator (1) | 2020.03.30 |
Set (1) | 2020.03.26 |
CSS (0) | 2020.03.24 |
댓글