rueki
Variable Scope(변수 범위) 본문
Inflearn - 모두를 위한 파이썬 : 필수 문법 배우기 강의 정리
중요 키워드 : scope, global, local, nonlocal, locals, globals
예제 1번. 전역변수에 대해서 알아보자.
a = 10
def foo():
print('Ex1>', a)
foo()
print('Ex1>', a)
"""
결과
Ex1> 10
Ex1> 10
"""
전역 변수 a를 선언하고 foo라는 함수를 선언했는데, 그 속의 a 변수는 전역 변수 a로 호출이 된다.
그래서 단순히 a를 print한 것과 함수를 호출해서 실행한 것은 결과가 같게 나온다.
예제 2번. 전역변수와 지역변수
b = 20
def bar():
b = 30
print('Ex2>', b)
print('Ex2>', b)
"""
결과
Ex2> 30
Ex2> 20
"""
이 예제 같은 경우는 함수의 결과는 30으로 나오고 그 다음 print문은 20이 나온다.
그 이유는 항상 Scope 내 변수를 먼저 찾고 찾고자 하는 것이 없을 때 전역으로 나가기 때문이다.
만약 b = 30이 없었다면 20이 두번 출력되었을 것이다.
예제 3번. 지역변수 참조 에러
c = 40
def foobar():
c = c + 10
print('Ex3 >', c)
"""
결과
UnboundLocalError: local variable 'c' referenced before assignment
"""
이 예제의 경우 foobar라는 함수 scope 안에 c 변수가 없는데 c를 참조하려 했기에 에러가 발생한 것이다.
해결 방법은 + 연산을 하지 않거나 혹은 foobar안에 c = 10 과 같이 지역변수를 선언해주는 방법이 있다.
예제 4번. global 기능
d = 50
def barfoo():
global d
d = 60
print('Ex4>', d)
barfoo()
print('Ex4>', d)
"""
Ex4> 60
Ex4> 60
"""
d = 50이라는 전역변수를 선언했으나 왜 결과는 전부 60이 나오는 것일까
답은 global이라는 기능 때문이다.
d를 50으로 선언했으나, barfoo안에서 d를 전역변수로 선언하고 60을 할당했기에 결국 전부 60이라는 값이 나오는 것이다.
예제 5번. Closure 형태
def outer():
e = 70
def inner():
nonlocal e
e += 10
print('Ex5>', e)
return inner
in_test = outer()
in_test()
중첩 함수는 자신을 감싸고 있는 함수의 영역 변수를 참조한다.
이 변수를 변경하고자하면, nonlocal로 선언을 해주어야한다. 이 기능의 의미는 inner 함수의 local로 생각하지 않겠다라고 위에서 해석할 수 있겠다.
예제 6번. locals와 globals
#local scope에 무엇이 있는지 알아보는 기능 : locals()
def func(var):
x = 10
def printer():
print('Ex6 >', "Printer Fucn Inner")
print('Func Inner', locals())
func('Hi')
#globals()
print('Ex7 >', globals())#전역 전체 출력
#변수 생성 자동화
for i in range(1,10):
for k in range(1,10):
globals()['plus_{}_{}'.format(i,k)] = i + k
print('Ex8 >', plus_5_5) # 10
locals와 globals를 출력하면 프로그램 내의 지역변수와 전역변수 관련해서 출력이 된다.
'python' 카테고리의 다른 글
Shallow Copy, Deep copy (0) | 2021.01.05 |
---|---|
Lambda, reduce, map, filter (0) | 2021.01.05 |
OpenCV로 두 가지 영상 합성해서 이어붙이기 (0) | 2020.12.02 |
Opencv tutorial(python) Template matching (0) | 2020.07.01 |
Opencv tutorial(python) 이미지 Thresholding (0) | 2020.06.25 |