변수이름설정, 변수활용도에 따른 변수설계가 중요하다.
- 지역변수 : 해당 변수가 포함된 함수 안에서만 수정하고, 읽을 수 있다.
- 지역변수는 이름이 같더라도, 소속된 함수가 다르면 다른 변수로 취급
- 지역변수는 함수만의 것: 각 함수가 호출되어 실행될 때 만들어지고, 함수의 실행이 끝나면 모두 삭제된다.
- 전역변수(global variable) : 하나의 파이썬 파일전체에서 값을 읽을 수 있다.
되도록이면 함수 안에서 사이드이펙트 및 가독성을 위해 값을 수정하지 않도록 한다.- 전역변수는 어디에서나 읽을 수 있지만, 함수 안에서 전역변수에 새로운 값을 대입하는 것은 금지된다.
- global 문을 사용하면 예외적으로 가능해진다.
- global 전역변수(global global variable) : 일반 전역변수와 다른 점은 변수가 생성되는 시점만 다르다.
- 함수내부에서 전역변수를 global문을 사용하여 선언해주면 함수 내에서만 전역변수의 역할을 한다.
- 다른 사람의 프로그램을 읽을 수 있도록 global 문의 사용법을 알아두되, 가급적이면 사용하지 않도록 하자.
특징 | 전역변수 | 지역변수 |
함수 안에서 읽기 | 가능 | 가능 |
함수 안에서 수정 | 불가(*) | 가능 |
함수 밖에서 읽기 | 가능 | 불가 |
함수 밖에서 수정 | 가능 | 불가 |
예시 1
# 아래 소스코드를 한 줄씩 실행하면서 지역변수와 전역변수에 대해 파악한다.
g_var = 'g_var' # 전역변수 ## 함수 밖 전역변수
# 값 수정후(수정값)
def variables():
global glo_var # global 전역변수 ## 함수 안 전역변수
glo_var = 'glo_var' # global 전역변수에 새로운 값 할당
lo_var = 'lo_var' # 지역변수
print()
print('(값 수정후)함수 안에서 g_var(전역변수) : ', g_var) # 수정되지 않고 초기값을 출력함
print('(값 수정후)함수 안에서 glo_var(global 전역변수) : ', glo_var) # 함수에서 수정된 후 값을 출력함
print('함수 안에서 lo_var(지역변수) : ', lo_var) # 특정 함수에서만 출력되는 지역변수
# 전역변수를 파라미터로 담은 함수
def second_variables(glo_var,g_var):
glo_var = 'glo_var in second_variables()'
g_var = 'g_var in second_variables()'
lo_var = 'second lo_var'
print('서로 다른 함수에서 지역변수이름이 같은 경우 :',lo_var)
return glo_var,g_var
# 값 수정전(초기값)
g_var = 'g_var_new_value'
glo_var = 'glo_var_new_value'
print('(값 수정전)함수 밖에서 g_var(전역변수) : ', g_var)
print('(값 수정전)함수 밖에서 glo_var(global 전역변수) : ', glo_var) # 새로 할당된 값으로 수정됨
# print('함수 밖에서 lo_var(지역변수) : ', lo_var) # 특정 함수 안에서만 사용하는 지역변수이므로 출력안됨
# 전역변수의 값 수정
#print('함수의 파라미터가 전역변수인 경우 :', second_variables(glo_var, g_var))
# 지역변수를 갖고 오는 경우
#print('함수의 파라미터가 지역변수인 경우 :', second_variables(glo_var, lo_var))
# 함수에서 수정된 전역변수 재호출
print('전역변수값 :',glo_var, g_var)
variables()
예시 2
seconds_per_minute = 60 # 1분은 60초 ## 함수밖에서 어디든 사용할 수 있는 전역변수
def minutes_to_seconds(minutes):
"""분을 입력받아 같은 시간만큼의 초를 반환한다."""
seconds = minutes * seconds_per_minute # 전역변수와 매개면수munutes를 함수안에서 계산저장하는 지역변수
return seconds
print(minutes_to_seconds(3)) # 화면에 180이 출력된다
print(seconds) # ❸ 오류! 함수 밖에서 지역변수를 불렀다
180
NameError: name 'seconds' is not defined
예시 3
global 문의 사용 예
'''함수 안에서 전역변수를 수정하려는 오류'''
num_stamp = 0 # 쿠폰 스탬프가 찍힌 횟수 (전역변수)
def stamp():
"""쿠폰 스탬프가 찍힌 횟수를 증가시키고, 화면에 출력한다."""
num_stamp = num_stamp + 1 # ❶ 전역변수를 수정하려고 시도함
print(num_stamp)
UnboundLocalError: local variable 'num_stamp' referenced before assignment
''' global문을 삽입해 전역변수 변경'''
num_stamp = 0 # 쿠폰 스탬프가 찍힌 횟수 (전역변수)
def stamp():
"""쿠폰 스탬프가 찍힌 횟수를 증가시키고, 화면에 출력한다."""
global num_stamp # ❶ num_stamp는 전역변수다
num_stamp = num_stamp + 1 # 이제 오류가 발생하지 않는다
print(num_stamp)
stamp() # 화면에 1이 출력된다
stamp() # 화면에 2가 출력된다
1
2
예제 4
예제3의 함수를 gobal전역변수 대신 매개변수와 반환을 이용하여 진행
num_stamp = 0 # 쿠폰 스탬프가 찍힌 횟수 (전역변수)
'''전역변수를 함수의 매개변수로 받아서 함수내에서 지역변수로 변환하여 사용'''
def stamp(num_stamp): # 지역변수(매개변수) num_stamp
"""쿠폰 스탬프가 찍힌 횟수를 증가시키고, 화면에 출력한다."""
num_stamp = num_stamp + 1
print(num_stamp)
return num_stamp
num_stamp = stamp(num_stamp) # ❸ 전역변수에 함수의 반환값을 대입한다
num_stamp = stamp(num_stamp)
num_stamp = stamp(num_stamp)
1
2
3
ref. https://python.bakyeono.net/chapter-3-4.html
'Computer Science' 카테고리의 다른 글
[Computer Science] 리팩토링과 최적화 -Refactoring, Data Optimization (0) | 2021.09.22 |
---|---|
[Computer Science] 예외처리(exception handling) - if ~else / try~except (0) | 2021.09.22 |
[Computer Science] 컴프리헨션(comprehension) (0) | 2021.09.21 |
[Computer Science] OOP 개념을 활용하여 코드설계 (0) | 2021.09.14 |
[Computer Science] 파이썬 with OOP(Object-Oriented Programming) (0) | 2021.09.13 |