Python | 전역변수와 지역변수

Sua·2020년 12월 26일
0

Python

목록 보기
19/28
post-thumbnail

전역변수와 지역변수

함수를 포함하여 스크립트 전체에서 접근할 수 있는 변수를 전역 변수(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)라고 한다.

함수 안에서 전역 변수 변경하기(global)

전역변수는 프로그램 어디서든 읽을 수 있다. 단, 함수 안에서 전역변수에 새로운 값을 대입할 수는 없다.

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 문 사용시 가능

함수의 지역 변수 변경하기(nonlocal)

전역 변수와 지역 변수의 개념은 함수 안의 함수에서도 똑같이 적용된다.

함수 안에서 함수는 다음과 같이 만들 수 있다.

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/

profile
Leave your comfort zone

0개의 댓글