본문 바로가기
방구석코딩/파이썬 기초문법

[파이썬 독학] 지역변수와 전역변수

by 석세상 2022. 8. 8.
반응형

이전에 함수 만들기 부분에서 변수 적용범위에 대해서 배웠던 것이 기억나나요? 그때는 함수 안에 있는 변수와 함수 밖에 있는 변수는 변수명이 동일하더라도 다른 변수로 인식한다라고만 알고 넘어갔는데요. 그 부분에 대해서 좀 더 자세히 알아볼까요?

[파이썬 독학] 데이터 분석 - 함수 만들기 : 변수 적용 범위 (tistory.com)

 

[파이썬 독학] 데이터 분석 - 함수 만들기 : 변수 적용 범위

파이썬에서 함수를 만들 때 함수 밖에 있는 변수명과 함수 안에 있는 변수명이 동일하다면 어떻게 적용될까? 함수 만들기 - 초기값 설정 오류 test라는 함수명으로 함수를 생성했는데 test(a)로 실

gusugi.tistory.com

 

지역변수와 전역 변수 정의

변수의 종류를 구분하는 기준 중 하나는 변수의 적용 범위에 대한 기준으로도 나눌 수 있습니다. 크게 지역변수와 전역 변수로 구분하게 됩니다. 그러면 이 두 가지에 대해서 알아보도록 합니다.

  • 지역변수 : 함수 내에서만 사용하는 변수로서 함수 호출 시에만 적용됨
  • 전역 변수 : 프로그램 내 어디서든 불러서 사용할 수 있는 변수

위의 내용을 보자면 함수를 정의할 때 사용했던 변수 즉, 함수명과 함께 사용되는 변수는 지역변수로 그 함수 내에서만 사용하는 변수, 한 지역에서만 사용하는 변수라고 이해하면 될 것 같고 그 외 코딩 시 쓰이는 변수는 전역 변수라고 생각하면 됩니다. 그러면 예제를 가지고 좀 더 명확하게 구분해보도록 해요.

 

 

예제를 통한 지역변수와 전역 변수의 구분

지역변수 예시

예제는 딸기주스를 만드는데 딸기주스를 만드는데 딸기가 3개가 필요하다고 하자. 그럼 아래와 같이 함수를 정의할 수 있을 것입니다.. 하지만 막상 함수를 실행해보니 아래와 같은 에러가 발생했는데요. 이유는 뭘까요? 로그에 에러 메시지를 확인해보면 stawberry라는 함수가 지역변수로 할당 전에 참조되었다고 합니다. 그 말은 stawberry가 먼저 정의가 되어 있어야 한다는 말입니다.

 

하지만 함수 사용 전에 stawberry를  정의했는데요. 그럼에도 불구하고 함수 내에 stawberry가 정의되어 있지 않기 때문에 다음과 같은 에러가 발생하는 것입니다. 함수 내에서는 지역변수의 정의가 필요하기 때문이죠. 

함수 내 지역변수 미정의로 인한 에러

 

 

따라서 위의 에러를 참고 삼아 실행 가능하도록 함수 내 stawberry를 정의하여 실행해보도록 합니다. 또 이때 실행 결과를 통해 어떻게 다른 지도 비교해보도록 하죠. 자 이번에는 함수 안에 stawberry에 대해서 정의하였습니다. 그리고 동일한 이름인 stawberry로 함수 밖에서도 정의했는데요. 이 둘을 비교하기 위해 1, 2, 3의 결과를 비교했습니다.

 

1번의 결과는 10으로 stawberry의 값을 출력했습니다. 2번은 함수를 실행한 결과인데요. 함수 내의 stawberry의 값은 24로 줄어든 것을 볼 수 있습니다. 그럼 stawberry의 값이 24로 줄어들었으므로 다시 한번 stawberry의 값만 출력해본다면 어떤 결과가 나올까요? 3번의 결과를 보면 그대로 다시 10으로 출력되는 것을 볼 수 있습니다. 이는 함수 밖의 stawberry에 대한 값이 출력되었기 때문이죠. 이와 같이 함수 내에서만 사용되는 변수를 지역변수라 합니다. 이제 조금 이해가 되셨나요?

지역변수 실행결과 비교

 

 

전역 변수 예시

자 그럼 함수 내에서만 사용하는 변수를 지역변수라고 하며, 함수 밖에 있는 동일한 명의 변수가 있더라도 다르게 적용된다는 것을 알았는데요. 그렇다면 함수 밖에 있는 변수를 그대로 이용하고 싶은 경우에는 어떻게 할까요? 

 

이런 경우 전역 변수를 지정해서 사용하는데요. 전역 변수로 지정하게 되면 같은 변수명은 모두 함수 내/외에 상관없이 다 같이 사용할 수 있는 변수가 됩니다. 하지만 전역 변수를 많이 사용하는 경우 코드 관리의 어려움이 발생할 수 있어 특별한 경우가 아니라면 사용하지 않는 것이 좋다고 합니다. 

 

아래 예시를 보시면 함수 내에 global이라는 명령어와 함께 stawberry를 입력해주면 전역 변수로 stawberry를 지정하게 됩니다. 그러면 함수밖에 있는 stawberry의 값을 적용할 수 있는 것이죠. 따라서 global을 지정하지 않았더라면 에러 발생과 함께 함수가 실행되지 않았을 테지만 문제없이 실행된 것을 볼 수 있습니다. 다음으로 함수를 이용하지 않고 stawberry의 값을 프린트해보았는데요. 앞에서와는 다르게 함수가 실행된 결괏값으로 출력되는 것을 볼 수 있습니다.

전역변수 사용 결과

 

 

 

전역 변수처럼 사용하기

앞서 전역 변수의 경우 많이 사용하는 경우 코드 관리의 어려움이 발생할 수 있다고 했는데요. 이런 문제점으로 인해 함수 내에서 함수 밖의 변수가 필요한 경우 다음과 같이 적용하여 사용하는 방법이 있으니 참고 바랍니다.

 

함수 내에 실제 전역 변수로 지정하는 global이라는 명령어 없이 전역 변수와 동일한 결과를 출력한 것을 알 수 있을 것입니다. 아래 내용을 찬찬히 뜯어보면 stawberry를 함수의 변수명으로 줍니다. 그렇게 되면 함수를 실행할 때 stawberry 변수는 함수밖에 있는 stawberry의 값을 불러와 10이 입력됩니다. 그리고 cup에는 딸기주스 2컵을 만들기 위해 2를 넣습니다.

 

그리고 이 함수를 실행한 결과를 다시 stawberry로 지정하는 것이죠. 그러면 함수가 실행된 딸기주스 2컵을 만든 이후 남은 딸기의 수가 다시 stawberry에 저장됩니다. 그렇기 때문에 전역(global) 변수로 지정한 것과 동일한 효과를 가져오게 되는 것이죠.

전역변수처럼 활용하기

 

728x90
반응형

댓글