<개인공부>/[Python]

[python] 파이썬 전역변수, 지역변수 정리

BlockDMask 2021. 9. 13. 00:30
반응형

안녕하세요. BlockDMask 입니다.
오늘은 파이썬 전역변수와 지역변수에 대해서 정리해보겠습니다.

<목차>
1. 파이썬 전역변수와 지역변수 설명
2. 파이썬 지역변수, 전역변수 예제

 

1. 파이썬 전역변수와 지역변수 구분


1-1) 지역변수와 전역변수 구분

(1) 전역변수 - global variable

프로그램이 시작하고 끝날때 까지 존재하는 변수 입니다.
즉, 전역변수는 프로그램이 실행되고 변수가 생성 및 초기화 되고 프로그램이 끝날때 까지 존재하는 변수 입니다.

example.py 파일이 있다고하면 그 프로그램 처음부터 끝까지 같이 가는 변수 입니다.

 

(2) 지역변수 - local variable

지역변수는 어딘가에 속해있는 변수입니다.
속해있는 곳이 함수라면
함수의 지역변수의 경우에는 함수가 호출되었을때 생성되고, 함수가 끝나면 사라지게 됩니다.

속해있는 곳이 클래스라면
클래스의 객체가 생성될때 변수가 생성되고, 객체가 사라질때 사라지게 됩니다. 

아래와 같은것들을 지역변수라고 합니다.
- 클래스 내부에 있는 변수
- 클래스 내부 메서드 안에 있는 변수

- 함수 내부에 있는 변수
등등 어딘가에 속해있는 변수 모두.

모두 지역변수이며, 각 범위안에서만 영향이 있습니다.

지역변수랑 전역변수를 한번 코드로 볼까요?

 

1-2) 지역변수와 전역변수 코드 확인

g_var = "global"  # 전역변수


def func():
    l_var = "local"  # 지역변수
    print(l_var)  # 지역변수 접근 가능
    print(g_var)  # 전역변수 접근 가능


print(g_var)  # 접근 가능
# print(l_var) # func()의 지역변수 이므로, func() 외부에서는 없는 변수입니다. error

g_var는 전역변수 이므로 함수의 안이든 밖이든 모두 접근이 가능합니다.

l_var는 func() 함수의 내부에 있는 지역변수 이므로 func() 함수 내부에서만 접근이 가능하고, 
외부에서 접근을 하려고 했을경우엔 없는 변수 이므로 Name Error 에러가 나오게 됩니다.

 

**추가 설명 (이해를 돕기위함 입니다.)
예를 들어서 한 집에 와이파이 G와 L 두 종류가 있다고 하겠습니다.
G wifi  범위가 넓어서 집 전체를 차지할 수 있지만
L wifi는 범위가 작아서 방 하나정도를 차지하고 있다고 가정해보겠습니다.

L 와이파이는 그 방을 벗어나게되면 더이상 기능을 하지 못하게 됩니다. 방 안에서만 접근이 가능하죠.
지역변수를 L wifi 라 생각하면 됩니다.
방 안에서는 L wifi 가 당연히 접근이 가능하겠죠?
=> 함수, 클래스 안에서 지역변수 접근가능

방 안에서 L wifi 뿐만 아니라 G wifi 도 접근이 가능합니다. G wifi는 집 내부 어디서든 접근이 가능하니까요
=> 전역변수는 함수 클래스 안에서도 접근이 가능하다. 어디서나 접근 가능

방을 벗어나면 L wifi 에 접근이 불가능 하겠죠?
=> 함수, 클래스 밖에서는 지역변수 접근 불가

화장실에서 L wifi 접근 불가, 화장실에는 다른 L2 wifi 가 있겠죠?
=> 함수1, 함수2에 각 지역변수 1, 2가 있음.

그렇지만 다시 방안에 들어가면 L wifi에 접근이 가능합니다.
=> 함수 다시 호출하면 지역변수 생성되서 함수 내부에서 접근가능

G 와이파이는 집 전체 어디서든 접근이 가능합니다.
전역변수를 G wifi 라 생각하면됩니다.
집 어디서든, 함수 내부든 클래스 내부든 함수 외부든 언제 어디서나 접근이 가능한 그런 변수가
그것이 전역변수 입니다.

 

2. 파이썬 전역변수, 지역변수 예제


2-1) 지역변수와 전역변수 예제 

a = 10  # 전역변수


def func():
    a = 20  # 지역변수
    print(f"2. {a}")
    return a + 100  # 여기서의 a는 바로위 지역변수 a


print(f"1. {a}")
print(f"3. {func()}") # func() 함수가 호출되고 끝나면 func() 내부 지역변수가 살았다가 사라짐

코드를 살펴보면 프로그램이 시작하자마자 어디에도 속해있지 않는 변수 a를 10으로 초기화 했습니다.
이 a는 전역변수 입니다. 프로그램이 시작하고 끝날때 까지 존재합니다.

함수 func() 안에 있는 a = 20은 함수 내부에 속해있는 지역 변수 입니다.
함수가 호출될때 생성되고 함수 호출이 끝나면 사라지는 지역변수 입니다.

함수 func()안에서 a + 100 을 할때 여기에 있는 변수는 지역변수 a입니다.
함수나 클래스 내부에서 변수에 접근을 하게 되면 그 지역에 속해있는 지역변수에 디폴트로 접근하게 됩니다.

결과를 한번 살펴보겠습니다.

- 첫번쨰 결과 "1. 10"
print(f"1. {a}") 는 전역변수 a를 뜻해서 10이 나오는 것을 알 수 있습니다.

- 두번째 결과 "2. 20"
print(f"2.{a}")는 함수 func 내부에서 호출하기 때문에 func 함수 내부의 지역변수 a=20 을 출력하고 있습니다.

- 세번째 결과 "3. 120"
print(f"3.{a}")는 func() 함수의 반환값인 20 + 100 = 120 이기 때문에 120이 나오게 됩니다.

즉 return a + 100 에서 불렀던 a는 함수 func내부의 지역변수 a=20 이라는 것을 알 수 있습니다.

 

2-2) 함수 내부에서 전역변수의 값을 변경하고 싶을때 global 을 사용

a = 10  # 전역변수


def func():
    global a        # 전역변수를 받아옴
    a = 50          # 지역변수가 아닌 전역변수이므로 전역변수 a 값이 변경됨
    print(f"2. {a}")
    return a + 100  # 여기서의 a는 전역변수 a


print(f"1. {a}")
print(f"3. {func()}")  # func() 함수가 호출되고 끝나면 func() 내부 지역변수가 살았다가 사라짐

바로 위 예제와의 다른점은 global a 가 있고 없고의 차이 입니다.
a를 사용하기 전에 global a 명령을 통해서 전역변수에 있는 a를 가지고 옵니다.
이제 a의 값을 변경하거나 하면 전역변수 a를 변경하는 것과 같습니다.

a = 10		# 전역 변수 a

def func1():
    a = 99  # 새로운 지역변수 a 이므로 이 값을 바꿔도 전역변수에는 영향이 없습니다.
    
    
def func2():
    global a	# 전역변수 a를 가지고옴(=연결함, 참조함)
    a = 44		# 전역변수 a 의 값이 변경됨

코드로 보시면 한번에 이해가 가시나요?
이렇게 global 이라는 키워드를 통해서 전역변수를 참조할 수도 있습니다.

 

이상으로 파이썬 변수(지역변수, 전역변수)에 대해서 이야기해보았습니다.
읽어주셔서 감사합니다.

반응형