본문 바로가기
Python/Python 중급

Python 파이썬 함수 지역변수, 전역변수

by 베타코드 2022. 1. 13.
반응형

안녕하세요 독학코딩입니다. 오늘은 파이썬 함수의 지역변수와 전역변수에 대해서 배워보겠습니다.

  • 지역변수는 함수 내에서 잠깐 사용하고 함수가 끝나면 사라지는 변수를 말합니다.
  • 전역변수는 코드 내의 어디서든 사용할 수 있는 변수를 의미합니다.

전역변수는 어디서든 사용할 수 있으니 사용성이 좋지만 실무에서는 여러 명이 한번에 코딩을 하게되고 수천 수만 줄의 코딩을 하기 때문에 전역변수를 남발하면 코드가 에러가 나는 경우가 많습니다. 그래서 지역과 전역을 적당히 조절하면서 사용하시는게 좋습니다.

 

Python 함수 지역변수와 전역변수

bbang = 10

def eat_bbang(eaten):
    bbang = bbang - eaten
    print("남은 빵은 {}개 입니다.".format(bbang))

eat_bbang(3)

 

위의 예제를 실행해보시면 UnboundLocalError: local variable 'bbang' referenced before assignment 에러가 나올 겁니다. local variable 지역변수 bbang이 할당 전에 사용되었다는 의미입니다. 여기서 알 수 있듯이 bband은 지역변수 입니다.

할당 전에 사용되었다는 건 bbang이 정의 되기 전에 사용되었다는 의미 입니다. 즉 eat_bbang() 함수 위에 있는 bbang과 함수 내에 있는 bbang은 서로 다른 것 입니다. 둘다 지역변수 인거죠.

그럼 위의 eat_bbang() 함수를 오류없이 사용하려면 어떻게 해야될까요? 간단합니다. bbang 을 전역변수로 선언해주면 됩니다.

bbang = 10

def eat_bbang(eaten):
    global bbang
    bbang = bbang - eaten
    print("남은 빵은 {}개 입니다.".format(bbang))

eat_bbang(3)

 

이렇게 global bbang 선언을 해주시면 bbang 을 전역변수로 선언할 수 있습니다. 다만, 유념하셔야 될게 있습니다. 한번 전역변수로 선언하면 코드내에 어디서든 bbang은 모두 같은 걸 의미하게 됩니다. 그래서 상당히 긴 코드를 짤 때는 전역변수를 피하시는게 좋습니다.

그럼 전역변수 없이 위의 코드를 어떻게 똑같이 만들까요?

def eat_bbang(bbang, eaten):
    bbang = bbang - eaten
    print("남은 빵은 {}개 입니다.".format(bbang))

 

 

이렇게 하면 된다고 생각하시나요? bbang 자체를 전달값으로 전달하여 출력하면 될 것 같지만 아닙니다.

bbang = 10

def eat_bbang(bbang, eaten):
    bbang = bbang - eaten
    print("남은 빵은 {}개 입니다.".format(bbang))

print(bbang)
eat_bbang(bbang, 3)
print(bbang)

 

위 예제로 테스트 해보시면 eat_bbang(bbang, 3) 위아래에 있는 print(bbang)가 결과가 똑같다는걸 알 수 있을 겁니다. 즉, 지역변수를 전달하여 함수 내에서 코드를 실행해도 함수 밖의 지역변수에는 영향을 주지 않습니다. 말이 조금 어려울 수도 있지만, eat_bbang() 으로 전달한 bbang과 함수 안에 있는 bbang은 서로 다른 것 입니다.

전역변수 없이 정확히 만드려면 이렇게 하시면 됩니다.

bbang = 10

def eat_bbang(bbang, eaten):
    bbang = bbang - eaten
    print("남은 빵은 {}개 입니다.".format(bbang))
    return bbang

print(bbang)
bbang = eat_bbang(bbang, 3)
print(bbang)

 

반환 return을 이용하여 eat_bbang() 함수 내에서 처리된 bbang 결과 값을 함수 밖의 bbang에 전달해주면 됩니다. 잘 이해가 되셨을지 모르겠습니다.

반응형

댓글