파이썬에는 이번 포스팅에서는 이 두 개의 키워드가 왜 필요하고 어떤 경우에 사용해야되는지에 대해서 알아보도록 하겠습니다. 비단 파이썬 뿐만 아니라 대부분의 프로그래밍 언어에서 변수의 범위라는 것은 해당 변수를 어디에서 선언하느냐에 따라서 결정이 됩니다. 아주 단순하게 두 구역으로 나누면 함수 외부를 전역(global/module) 범위라고 하고, 함수 내부를 지역(local/function) 범위라고 합니다. 또한 함수를 중첩했을 때 외부 함수와 내부 함수의 사이에서 생겨나는 비지역(nonlocal/enclosing) 범위라는 것도 있습니다. 이 세 구역의 범위를 각 함수의 입장에서 간단하게 주석으로 나타내보면 다음과 같습니다. (파이썬에서는 추가적으로 내장(built-in) 범위라는 것도 있지만 같은 범위 내에서는 자유롭게 변수에 접근이 가능하지만 다른
범위에서 선언된 변수에 접근할 때는 정해진 제약을 따르게 됩니다. 기본적으로 바깥 쪽 범위 내에서 선언된 변수를 안 쪽 범위에서는 접근할 수 있지만, 반대로 안 쪽 범위 내에서 선언된 변수를 바깥 쪽 범위에서 접근하는 것은 불가능합니다. 예를 들어,
변수의 범위의 다른 중요한 특성은 서로 다른 범위에서는 변수 이름 충돌이 발생하지 않으며 안 쪽 범위에서 바깥 쪽 범위에서 선언된 변수와 똑같은 이름의 변수를 생성할 수 있다는 것입니다. 예를 들어, 아래에 선언된 3개의
이러한 현상을 소위 variable shadowing이라고 부르기도 하는데요. 코드 가독성을 해치기 때문에 일반적으로 피해야하는 코딩 관행으로 여겨지고 있지만 지금부터 설명드릴 아래 코드를 실행하면 무엇이 출력이 될까요?
그러면 아래와 같이
많은 분들이 그러면 이와 같이 동일한 이름의 지역 변수를 생성하지 않고, 전역 변수의 값을 함수 내부에서 변경하고 싶다면 어떻게 해야할까요❓ 네, 이럴 때 사용하는 것이 함수 안에서 변수 앞에
위 코드를 실행하면 처음에 예상했던 데로 nonlocal 키워드
글로만 설명하면 이해가 어려울 수 있으니 예제 코드를 한번 같이 볼까요? 아래 두 개의 함수는 중첩이 되어 있습니다. 여기서
이 코드를 실행해보면 이 번에는
이 번에는 만약에
변수 앞에 위 코드를 실행하면 처음에 의도했던 데로 실전 예제
아래
얼핏보면 이 코드는 정상적으로 동작할 것 같지만 실행을 해보면 다음과 같은 오류가 발생을 합니다.
왜 그럴까요?
이 문제를 해결하기 위해서는
코드를 수정 후에 실행해보면 다음과 같이 전체코드본 포스팅에서 제가 작성한 코드는 아래에서 직접 확인하고 실행해보실 수 있습니다. https://deepnote.com/project/Blog-Yd3-DsV_QeGqo4AUZ7FyHg/%2Fpython-global-nonlocal.ipynb 마치면서외부 범위에서 선언된 변수를 내부 범위에서 변경할 수 있다는 것은 프로그래밍을 할 때 양날의 검으로 작용할 수 있습니다. 예를 들어, 전역 변수의 값이 여러 함수에 의해서 변경될 수 있다면 해당 전역 변수의 값이 어떻게 변해갈지 예측하기가 쉽지 않을 것입니다. 그러므로 예상치 못한 버그가 발생할 확률이 높아지고 코드의 복잡도는 올라가며 유지보수는 힘들어 질 것 입니다. 이 것이 아마도 파이썬에서 |