전역변수: 함수를 포함하여 스크립트 전체에서 접근할 수 있는 변수(global variable)
전역 범위(global scope): 전역 변수에 접근할 수 있는 범위
지역 변수(local variable): 변수를 만든 함수 안에서만 접근
지역 범위(local scope): 지역 변수를 접근할 수 있는 범위
! 전역변수를 함수 안에서 바꾸면 -> 새로운 지역변수로 됨.
함수 안에서 전역변수를 바꾸려면
global 전역변수이름
예
x = 10 # 전역 변수
def foo():
global x # 전역 변수 x를 사용하겠다고 설정
x = 20 # x는 전역 변수
print(x) # 전역 변수 출력
foo()
print(x) # 전역 변수 출력
def 함수이름1():
코드
def 함수이름2():
코드
변수 범위 구분
def A():
x = 10 # A의 지역 변수 x
def B():
x = 20 # x에 20 할당
B()
print(x) # A의 지역 변수 x 출력
A()
결과: 10
def A():
x = 10 # A의 지역 변수 x
def B():
nonlocal x # 현재 함수의 바깥쪽에 있는 지역 변수 사용
x = 20 # A의 지역 변수 x에 20 할당
B()
print(x) # A의 지역 변수 x 출력
A()
결과: 20
현재 함수 바깥에 있는 지역변수 사용하려면
- nonlocal 지역변수
nonlocal은 현재 함수의 바깥쪽에 있는 지역 변수를 찾을 때 가장 가까운 함수부터 먼저
global 키워드: 무조건 전역변수
클로저(closure) : 함수를 둘러싼 환경(지역 변수, 코드 등)을 계속 유지하다가, 함수를 호출할 때 다시 꺼내서 사용하는 함수
클로저는 지역 변수와 코드를 묶어서 사용하고 싶을 때 활용
예시
def calc():
a = 3
b = 5
def mul_add(x):
return a * x + b # 함수 바깥쪽에 있는 지역 변수 a, b를 사용하여 계산
return mul_add # mul_add 함수를 반환
c = calc() #함수 calc를 호출한 뒤 반환값을 c에 저장( c에는 함수 mul_add가 들어)
print(c(1), c(2), c(3), c(4), c(5))
결과: 8 11 14 17 20
함수 calc가 끝났는데도 c는 calc의 지역 변수 a, b를 사용해서 계산. c에 저장된 함수가 클로저입니다.
def calc():
a = 3
b = 5
return lambda x: a * x + b # 람다 표현식을 반환
c = calc()
print(c(1), c(2), c(3), c(4), c(5))
표준 입력으로 정수가 입력됩니다. 다음 소스 코드를 완성하여 함수 c를 호출할 때마다 숫자가 1씩 줄어들게 만드세요. 여기서는 함수를 클로저로 만들어야 합니다.
def countdown(n):
i = n+1
def new():
nonlocal i
i -= 1
return i
return new
n = int(input())
c = countdown(n)
for i in range(n):
print(c(), end=' ')
i를 n+1로 할당하고 1씩 감소하는 new함수 만듦.