본문 바로가기
메모/코딩

[파이썬] global 전역변수 사용

by 붕붕=33 2022. 6. 18.

변수에는 scope가 해당 함수 내로 제한되는 변수는 지역변수와

scope가 함수 뿐만 아니라 프로그램 전체에서 사용가능한 변수는 전역변수가 있다.

 

지역변수는 함수 호출 시 만들어져서 함수의 실행이 끝날 때 함께 없어지는 반면,

전역변수는 선언 이후부터 프로그램 종료 시까지 계속 존재한다.

 

 

 

일반적으로 전역변수의 사용은 지양하는 편이 좋으나

전역변수를 사용해야 하는 경우가 있기 마련이다.

 

파이썬은 인터프리터가 소스코드를 모두 해석한 후순차적으로 실행한다고 한다.

때문에 global 을 사용하여 해당 변수가 전역변수라는 것을 인터프리터에게 알려주어야 한다.

 

 

 

예제 1

메인 스크립트 영역 내에서 할당되는 전역변수는 메인 스크립트에 존재하는 모든 함수가

공용으로 접근 가능하다. 

 

def func1():
    if cnt == 100:
        print(cnt)

if __name__ == '__main__':
    cnt = 100
    func1()
    print(cnt)

 

위 코드에서 메인 스크립트 영역에서 cnt = 100으로 할당되고

 func1() 함수 안에서의 cnt는 전역변수로서의 cnt를 참조할 수 있다.

 

따라서 func1() 함수에서의 print문과 메인 스크립트 영역에서의 print문 모두 출력 가능하다.

 

 

 

하지만 지역변수는 함수 내에서 새롭게 할당하는 변수이고

전역변수는 함수 바깥에서 선언되는 변수이므로

지역변수와 전역변수의 이름이 같을 시 어떤 변수인지 알기 어렵다.

 

func1()에서와 달리 아래의 func2() 함수는 cnt = 777 라인에서

함수 내에서 새로운 값을 할당(등호 "=" 연산자 사용)했다.

 

def func2():
    if cnt == 100:
        cnt = 777
        print(cnt)

if __name__ == '__main__':
    cnt = 100
    func2()
    print(cnt)

 

이렇게 지역함수 내에서 변수에 값이 새롭게 할당되면 파이썬에서는 이를 지역변수로 해석한다.

 

즉, 소스코드 실행 전 파이썬 인터프리터가 소스코드를 읽어나가면서

func2() 함수 내부의 cnt = 777 라인을 보고 "cnt라는 새로운 지역변수를 생성"했다고 해석한다.

그리고 해석이 모두 끝난 후 소스코드를 순차적으로 실행하게 되는데,

메인 스크립트 영역을 실행하여 func2()를 호출하게 되고

func2() 함수 내부의 if cnt == 100 조건문을 실행하려 할 때

"해석할 때는 func2() 내의 변수인 cnt가 지역변수로 생성되었다고 했는데,

cnt라는 지역변수가 만들어지기 전에 지역변수 cnt가 선언 및 할당되지 않았기 때문에

cnt == 100 조건문은 처리 불가능"하다고 하면서

"UnboundLocalError: local variable 'cnt' referenced before assignment" 와 같은 에러를 발생시킨다.

 

 

 

이를 해결하기 위해 사용하는 것이 global이다.

 

아래의 코드와 같이 func2() 함수 내에 cnt 변수가 사용되기 전 global cnt 라인을 추가하여 인터프리터에게 cnt가 전역변수로 사용된다는 것을 알려줄 수 있다.

 

def func2():
    global cnt		# global을 통한 전역변수 명시
    if cnt == 100:
        cnt = 777
        print(cnt)

if __name__ == '__main__':
    cnt = 100
    func2()
    print(cnt)

 

정수 뿐만 아니라 어떤 타입의 변수이건 전역변수 사용 시 적용된다. 

 

또한 등호(=) 연산자 뿐만 아니라 "+=, -=, *=, /=" 등의 복합대입연산자 모두 값을 할당하므로

이에 유의하여 전역변수를 사용해야 한다.

 

 

 

예제 2

위의 예제에서는 메인 스크립트 영역에서 할당된 전역변수가

함수 내에서 전역변수로 참조되는 경우를 다루었다.

 

그렇다면 전역변수가 메인스크립트 영역이 아니라 함수 내에서 선언되고 또다른 함수 내에서 참조되는 경우는 어떻게 전역변수를 사용할 수 있을까?

 

다음의 코드를 보자.

 

def sub_func():
    cnt += 1
    print(cnt)

def func():
    cnt = 0
    for _ in range(5):
        sub_func()
    print(cnt)

if __name__ == '__main__':
    func()

 

위 예제 코드의 경우 메인 스크립트 영역 내에서 func()이 호출되고

func() 함수 내에서 cnt = 0으로 전역변수가 할당된다.

그리고 func() 함수에서 호출된 sub_func() 내에서 cnt += 1으로 새로운 값이 cnt 변수에 할당된다.

 

cnt 변수가 프로그램 전체에서 전역변수로 참조되려면 어떻게 해야할까? 

 

 

 

지역변수는 함수 내에서 선언되고 전역변수는 함수 밖에서 선언되므로 

 

아래의 코드와 같이 각 함수 내에서 cnt가 사용되기 전에 global을 사용

각 함수 내에서 cnt가 지역변수가 아니라 전역변수로 참조됨을 인터프리터에 알려줄 수 있다.

 

def sub_func():
    global cnt    # global을 통한 전역변수 명시
    cnt += 1
    print(cnt)

def func():
    global cnt    # global을 통한 전역변수 명시
    cnt = 0
    for _ in range(5):
        sub_func()
    print(cnt)

if __name__ == '__main__':
    func()

 

 

 

  • 참고 사이트

https://techblog-history-younghunjo1.tistory.com/399?category=1014800 

 

[Python] 재귀함수와 스택, 지역변수와 전역변수

이번 포스팅에서는 Python의 재귀함수가 스택을 활용한다는 점과 Python에서의 지역변수, 전역변수를 살펴보려고 한다. 이번 내용은 생각보다 기초적인 개념이지만 알고리즘 공부를 하면서 몰랐던

techblog-history-younghunjo1.tistory.com

https://wikidocs.net/62

 

3.3 지역변수, 전역변수

여러분 안녕하세요~. 오늘(이 장을 처음 쓴 날)은 제가 중간 시험 보는 날이랍니다. 시스템 프로그래밍이랑, 선형대수 과목이구요, 시스템 분석 설계 과제물도 내야합니다. ...

wikidocs.net

 

 

 

댓글