Python에는 지역 변수, 전역 변수 개념이 있다.
기본적으로 script 언어 형태를 띠기 때문에 구분하는 게 약간 애매하지만 아래와 같다.
global_variable = 100
print(global_variable) # 100
def func():
local_variable = 200
print(local_variable) # 200
print(global_variable) # 100
func()
한 가지 특이한 점이 있다면 func() 안에서 global_variable을 찾을 수 있다는 점이다. 기본적으로 Python은 호출된 스코프에서 해당 변수를 찾고, 만약에 스코프에 그 변수가 없다면 그다음 스코프에서 변수를 찾는다. 위 경우 func() 안에서 global_variable을 찾았는데 없으니 그 상위 스코프에서 변수를 찾아서 값을 print 하는 것으로 볼 수 있다.
종종 코딩 테스트에서 전역 변수를 사용할 일이 생기는데 보통 "재귀로 탐색해서 조건에 맞는 경우 값을 할당하는 경우"가 대부분이다. 이 경우 함수 내에서 전역 변수를 조작해야 하는데 이 경우는 전역 변수를 global 키워드를 사용하지 않으면 에러가 발생한다. 값을 조작하는 경우에는 상위 스코프(이 경우는 전역 스코프)로 넘어가서 탐색하진 않는 것 같다. 아무튼 필요할 때 적절히 사용하면 굉장히 유용하다.
하지만 코딩 테스트에서 검정 환경에 따라 이 전역 변수 사용이 발목을 잡는 경우가 있다.
예를 들면...
우리가 작성한 코드를 "A"라고 하자. 문제는 백준 스타일로 입력부터 출력까지 코드를 작성해야 하는 그런 스타일이다.
이런 경우는 특별히 문제가 없다. 내부 구조는 정확히 모르겠지만 테스트 케이스가 100번 있으면 내 코드를 100번 돌리는 방식으로 채점이 되는 것 같다.
하지만 내가 작성한 코드가 입출력 전부를 작성하는 코드가 아닌 결괏값을 반환하는 특정 함수를 작성하는 것이라면 문제가 생길 수 있다.
내 코드 A + 테스트 케이스 100개가 미리 적혀있는 메인코드라면?... 올바르게 작성했을 경우 첫 번째 테스트 케이스는 맞추겠지만, 함수 결괏값을 반환하기 직전에 사용한 전역 변수를 초기화하지 않았다면 두 번째 테스트 케이스부턴 틀릴 것이다.
나는 이런 상황을 외국 검정 환경에서 겪었는데, 당시에 어렵지 않은 문제였는데도 불구하고 예제 테스트 케이스가 맞지 않거나, 코드를 실행할 때마다 값이 다르게 나와서 매우 당황했었다.
전역 변수는 주의해서 사용하자.
'Algorithm' 카테고리의 다른 글
15. 3Sum (0) | 2021.04.02 |
---|---|
5. Longest Palindromic Substring (0) | 2021.04.01 |
정수 내림차순으로 배치하기 (0) | 2021.03.22 |
1781번: 컵라면 (Python) (0) | 2021.01.10 |
3954번: Brainf**k 인터프리터 (데이터 추가, 최신 버전, Python) (0) | 2021.01.02 |