인프런 리프의 파이썬 고급과정 1주차 복습 포스팅입니다.
Variable Scope
전역변수와 지역변수의 기준은 '함수'입니다. 함수 내부에서 선언되었느냐, 혹은 밖에서 선언됐느냐에 따라 전역/지역의 기준이 됩니다.
d = 50
def barfoo():
global d
d = 5
d += 10
print("ex 4 > ", d)
print('ex 4 >> ', d) # 50
barfoo()
>>> ex 4 >> 50
>>> ex 4 > 15
def outer():
e = 70 # 파이썬 클로져
def inner():
# e += 10 # 상위의 e를 그냥 가져다 쓰지 못한다.
nonlocal e
e += 10
print('Ex 5 > ', e)
return inner
in_test = outer()
# closure --> outer()함수 리턴하여 in_test변수에 저장 --> 곧 바로 inner()함수 호출
# 결과적으로 in_test에는 inner()함수 가 호출되어 할당된 상태
in_test()
in_test()
in_test()
# in_test() 함수를 계속 사용하면 값을 누적하여 더한다.
>>> Ex 5 > 80
>>> Ex 5 > 90
>>> Ex 5 > 100
# ex 6
def func(var):
x = 10
def printer():
print('ex 6', 'printer func inner')
print('func inner: ', locals())
# locals()라는 함수안에, printer라는 함수와 var, x변수가 딕셔너리 형태로 저장돼있음을 볼 수 있다.
func('hi')
# locals() 메서드가 리턴되면서 아래 'func inner:' 이하의 내용을 리턴
>>> func inner: {'var': 'hi', 'x': 10, 'printer': <function func.<locals>.printer at 0x10e362160>}
# ex 7
print('ex 7', globals())
globals()['test_variable'] = 100 # globals 딕셔너리에 'test_variable'이란 변수를 할당
print('ex 7', globals())
>>> # globals() 딕셔너리의 기존에 있던 값과 'test_variable':100이 key-value로 추가된다.
# ex 8 ( local -> global variable generate)
for i in range(1, 10):
for k in range(1, 10):
globals()['plus_{}_{}'.format(i, k)] = i + k
print(globals()) # globals() dictionary에 위의 이중for문으로 key-value할당
# 재밌는 사실은 plus_5_5는 key값 처럼 저장됐지만, globals()에 저장됐기에, plus_5_5만으로 value를 리턴할 수 있다.
print('Ex 8 > ', plus_5_5) # unresolved reference라고 뜨지만, 작동은 한다.
# 전역변수는 변하지 않는 고정 값에 사용 --> 함수형 프로그래밍에 자주 사용
# 지역변수 사용 이유: 지역변수는 함수 내에 로직 해결에 국한, 소멸주기 : 함수 실행 해제 시
# 전역변수를 지역내에서 수정는 것은 권장 x
모두를 위한 파이썬 : 필수 문법 배우기 Feat. 오픈소스 패키지 배포 (Inflearn Original)