Python/Python 시작하기

17. 파이썬 변수 - 전역변수와 지역변수

arvigoes 2019. 12. 25. 16:25

전역(global) 지역(local)                                       

프로그램을 만들면서 여러 가지 데이터에 여러 가지 이름을 붙여서(변수) 사용합니다.

그런데 이름이란 문맥에 따라서 지칭하는 대상이 다르기 마련입니다.

 

파이썬에서는  ‘namespace’이라는 개념을 이용해서 이름의 문맥을 구별합니다.

네임 스페이스는 프로그램 전체 범위의 global(전역)과 한정적인 영역의 local(지역)으로 구별됩니다.

전역공간에 정의되어, 프로그램 어디서든 부를 수 있는 이름을 전역변수(global variable)라고 합니다.

함수 밖에서 변수를 정의하면 전역변수가 됩니다.

직역공간에서 영역 내에서만 부를 수 있는 이름을 지역변수(local variable)라고 합니다.

모든 함수는 자신만의 영역을 가지며, 함수 속에서 작성한 변수는 그 함수의 지역변수가 됩니다.

 

함수의 지역변수는 함수가 실행되는 동안에만 존재합니다.

각 함수가 호출되어 실행될 때 만들어지고, 함수의 실행이 끝나면 모두 삭제됩니다.

그래서 지역변수는 그 변수가 속한 함수의 밖이나 다른 함수에서는 부를 수가 없습니다.

매개변수도 함수 안에 정의되므로 지역변수 입니다. 

 

전역(global) 지역(local) 사용 하기                        

# Code 1
# 전역과 지역변수 접근
Node = 15
def ADD_node(number):
    result = number + Node      #전역은 어디서나 가능
    return result

print(ADD_node(7))
print(Node)
print(result)                   # result 는 ADD_node 지역변수

17-1. 지역변수 외부 접근 에러

 

print(result) 에서 에러가 나오네요 name 'result' is not defined.

result 라는 변수가 정의되지 않았다는 뜻인데 print(result) 가 수행되는 영역이 global 영역 인데 global 영역에는 

result 라는 변수가 정의 되어 있지 않습니다.

result 는 ADD_node 라는 함수 영역에 선언된 지역변수 입니다.

# Code 2
# 변수명이 동일한 경우

result = '이름이 동일한 전역변수'
Node = 15
def ADD_node(number):
    result = number + Node      # result 는 지역변수로 새로 생성됨
    return result

print(ADD_node(7))
print(result)                   # result 는 global 변수

17-2. 이름이 동일한 경우

전역변수 에도 result 가 있고 지역에도 result 가 있는 경우 지역에서는 지역변수용 result 가 새로 생성되어 사용 됩니다.

전역의 result 는 변경되지 않는것을 확인 할 수 있습니다.

기본적으로 전역변수는 함수지역에서는 읽기로만 사용 가능합니다. Node 전역변수의 읽기는 가능합니다.

그러나 result 의 경우는 쓰기를 하기 위해서 새로운 지역변수가 생성 되는 것을 확인 해 볼 수 있습니다.

 

그런데 ADD_node 함수에서 지역변수로 같은 이름으로 정의 된 후에 전역변수 result 를 읽을 수는 없는 걸까요?

자료를 좀 더 찾아보고 방법을 찾게 된다면 이부분은 수정 하도록 하겠습니다.

혹시나 아시는 분이 있으시면 댓글로 부탁 드려요

 

그리고 전역의 변수는 지역에서 읽기로만 사용 가능 하다고 했는데

쓰기로도 사용 할 수 있습니다.

# Code 3
# 전역과 지역변수 접근

result = '이름이 동일한 전역변수'
Node = 15
def ADD_node(number):
    global result               # 전역변수 지역alias
    result = number + Node
    return result

print(ADD_node(10))
print(result)                   # result 는 ADD_node 지역변수

함수내 지역변수 선언할때 동일한 이름으로 global 키워드로 선언을 하면 됩니다.

17-3. global 키워드

전역의 result 도 값이 변경된 것을 확인 할 수 있습니다.

개인적인 의견으로는 글로벌 result 값의 변경을 위해 global 키워드 사용 보다는 return등 으로 해결하는 것이 더 바람직한 해결 방법인것 같습니다.

global 변수의 변경흐름을 저런식으로 특정함수 내부에서 처리 한다면 실행흐름이 눈에 보이지 않을 거 같아서 문제가 발생했을때 해결하기가 쉽지 않아 보이네요

 

각 영역변수의 행위 표 입니다.

행위 글로벌 변수 지역 변수
함수 영역에서 읽기 가능 가능
함수 영역에서 쓰기 불가( global 문 사용시 가능) 가능
global 영역에서 읽기 가능 불가
global 영역에서 쓰기 가능 불가

 

참고로 아래 함수도 한번씩 수행해 보시길 바랍니다.

globals()  ,  locals()

# Code 4
# 전역과 지역변수 접근

result = '이름이 동일한 전역변수'
Node = 15
def ADD_node(number):
    result = number + Node
    print(locals())
    return result

print(ADD_node(10))
print(result)                   # result 는 ADD_node 지역변수
print(globals())

17-4. globals locals

globals() : 글로벌 영역에 선언된 모든 변수를 출력합니다.

locals() : 로컬영역에 선언된 모든 변수를 출력합니다.

* 함수이름도 변수 입니다(?) 이건 참고로 알고만 계시면 됩니다. 그런데 파이썬도 이런지는 잘 모르겠네요..;ㄷㄷ

* 파이썬은 변수에 객체가 할당이 되면 이 정보를 dictionary 형태로 각 영역 namespace 에 저장 합니다.

위 두함수는 그 정보를 출력 하는 내장함수 입니다.