본문 바로가기

Computer Science

[Computer Science] 변수설계 - 지역변수와 전역변수

변수이름설정, 변수활용도에 따른 변수설계가 중요하다.
  • 지역변수 : 해당 변수가 포함된 함수 안에서만 수정하고, 읽을 수 있다.
    • 지역변수는 이름이 같더라도, 소속된 함수가 다르면 다른 변수로 취급
    • 지역변수는 함수만의 것: 각 함수가 호출되어 실행될 때 만들어지고, 함수의 실행이 끝나면 모두 삭제된다.
  • 전역변수(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

 

3.4 전역변수와 지역변수 | 연오의 파이썬 프로그래밍 입문서

파이썬으로 프로그래밍에 처음 입문하시는 분을 위한 책입니다. 프로그래밍 지식을 갖고 계시지 않더라도 누구나 학습하실 수 있습니다.

python.bakyeono.net