- routine, subroutine, proceduce, function
함수 정의
- 전역 변수(global variable) : global frame에 쌓인다.
- 지역 변수(local variable) : 함수가 호출되고 stack frame이 생길때 생기고 함수가 끝나면 사라진다.
- 함수 선언 시, 들여쓰기 공백은 4칸으로 4의 배수로만 띄워주면 문제없다.
1
2
3
4
5a = 10 # 전역 변수
b = 20 # 전역 변수
def func(c,d):
e = c + d # 지역 변수
return e
함수 호출
- 함수가 호출되는 시점이 바로 stack frame이 생성되는 시점이다.
1
2func(a, b)
>> 30
- 함수가 호출되는 시점이 바로 stack frame이 생성되는 시점이다.
namespace
변수의 유효 범위를 namespace 기반으로 결정
1
2
3
4
5
6
7
8
9
10
11
12# 전역 변수 g_val은 global frame에 생성
# stack frame이 생성되는 시점은 func(g_val)이 실행될 때
# def func(val) 부분이 생성 시점이 아님
# 함수가 호출됨으로 인해 매개변수 val은 120을 가리킴
# 하지만 전역 변수 g_val은 20으로 변하지 않음
g_val = 20
def func(val):
val += 100
func(g_val)
g_val
>> 20global문을 사용하여 func() 내에서 전역 변수 수정 가능
1
2
3
4
5
6
7def func():
global g_val
g_val += 30
func()
g_val
>> 50namespace 개념을 통해 ‘이름 공간’에서 가장 가까운 변수에 접근
- nonlocal문을 사용하면 함수에서 가장 가까운 해당 변수에 접근할 수 있다.
- nonlocal문으로 지정해주지 않아도 가장 가까운 해당 변수에 접근한다.
- 가장 가까운 변수에 접근하게 되면 그 이상의 공간 변수로 접근하지 않는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 변수 b와 같은 경우, 전역 변수와 지역 변수 모두 아니다.
a = 10
def outer():
b = 100
def inner1():
b = 30
def inner2():
nonlocal b
b -= 10
print(b)
d = 40
inner2()
inner1()
print(b)
outer()
>> 20
100