함수를 포함하여 스크립트 전체에서 접근할 수 있는 변수를 전역 변수(global variable)라고 부른다. 특히 전역 변수에 접근할 수 있는 범위를 전역 범위(global scope)라고 한다.
예를 들어, 파이썬 스크립트에서 변수를 만들면 다음과 같이 함수 안에서도 사용할 수 있다.
x = 10 # 전역 변수
def foo():
print(x) # 전역 변수 출력
foo()
print(x) # 전역 변수 출력
10
10
그럼 변수 x를 함수 foo 안에서 만들면 어떻게 될까?
def foo():
x = 10 # foo의 지역 변수
print(x) # foo의 지역 변수 출력
foo()
print(x) # 에러. foo의 지역 변수는 출력할 수 없음
10
Traceback (most recent call last):
File "C:\project\local_variable.py", line 6, in <module>
print(x) # 에러. foo의 지역 변수는 출력할 수 없음
NameError: name 'x' is not defined
변수 x는 함수 foo 안에서 만들었기 때문에 foo의 지역 변수(local variable)이다. 따라서 지역 변수는 변수를 만든 함수 안에서만 접근할 수 있고, 함수 바깥에서는 접근할 수 없다. 특히 지역 변수를 접근할 수 있는 범위를 지역 범위(local scope)라고 한다.
전역변수는 프로그램 어디서든 읽을 수 있다. 단, 함수 안에서 전역변수에 새로운 값을 대입할 수는 없다.
x = 10 # 전역 변수
def foo():
x = 20 # x는 foo의 지역 변수
print(x) # foo의 지역 변수 출력
foo()
print(x)
20
10
함수 안에서 전역 변수의 값을 변경하려면 global 키워드를 사용해야 한다. 다음과 같이 함수 안에서 global에 전역 변수의 이름을 지정해준다.
x = 10 # 전역 변수
def foo():
global x # 전역 변수 x를 사용하겠다고 설정
x = 20 # x는 전역 변수
print(x) # 전역 변수 출력
foo()
print(x) # 전역 변수 출력
20
20
특징 | 전역변수 | 지역변수 |
---|---|---|
함수 안에서 읽기 | 가능 | 가능 |
함수 안에서 수정 | 불가(*) | 가능 |
함수 밖에서 읽기 | 가능 | 불가 |
함수 밖에서 수정 | 가능 | 불가 |
*: global 문 사용시 가능
전역 변수와 지역 변수의 개념은 함수 안의 함수에서도 똑같이 적용된다.
함수 안에서 함수는 다음과 같이 만들 수 있다.
def print_hello():
hello = 'Hello, world!'
def print_message():
print(hello)
print_message()
print_hello()
Hello, world!
안쪽 함수 print_message에서는 바깥쪽 함수 print_hello의 지역 변수 hello를 사용할 수 있다.
하지만 바깥쪽 함수의 지역 변수를 안쪽 함수에서 변경할 수는 없다. 현재 함수의 바깥쪽에 있는 지역 변수의 값을 변경하려면 nonlocal 키워드를 사용해야 한다.
def A():
x = 10 # A의 지역 변수 x
def B():
nonlocal x # 현재 함수의 바깥쪽에 있는 지역 변수 사용
x = 20 # A의 지역 변수 x에 20 할당
B()
print(x) # A의 지역 변수 x 출력
A()
20
nonlocal은 현재 함수의 바깥쪽에 있는 지역 변수를 찾을 때 가장 가까운 함수부터 먼저 찾는다.
또한, 함수가 몇 단계든 상관없이 global 키워드를 사용하면 무조건 전역 변수를 사용하게 된다.
파이썬에서 global을 제공하지만 함수에서 값을 주고받을 때는 매개변수와 반환값을 사용하는 것이 좋다. 특히 전역 변수는 코드가 복잡해졌을 때 변수의 값을 어디서 바꾸는지 알기가 힘들다. 따라서 전역 변수는 가급적이면 사용하지 않는 것을 권장한다.
본 포스팅은 아래의 사이트를 참고하여 작성되었습니다.
연오의 파이썬 https://python.bakyeono.net/chapter-6.html
코딩도장 https://dojang.io/