[코드] 전역변수와 지역변수 란?

전역변수와 지역변수 란?


파이썬은 변수를 소스코드에 선언하는 경우 전역변수로 잡힌다.

전역변수는 모든 함수에서 접근할 수 있고, 해당 변수를 변경도 할 수 있다.

전역변수는 ‘공용’이라고 생각하면 된다.

예제1 (전역변수 방식)

«소스코드 예제»

def dfs1():
    print(cnt)

def dfs2():
    if cnt == 5:
        print(cnt)

cnt = 5
dfs1()
dfs2()
print(cnt)

cnt = 5
dfs1()

전역변수를 생성하고, dfs1()을 접근을 한다.

def dfs1():
    print(cnt)

dfs1()을 접근한 후, 함수안에 있는 변수가 함수에서 선언된 지역변수인지 먼저 확인한다.

만약 지역변수로 확인이 된다면 해당 변수를 이용한다.

하지만 함수 안에 지역변수가 없을 경우, 전역변수인지를 파악하여 전역변수로 사용을 한다.

«참조하는 순서»

지역변수 > 전역변수

결국 예제의 소스코드 출력은

5
5
5

로 나온다.

예제2 (지역변수 방식)

«소스코드 예제»

def dfs1():
    cnt = 3
    print(cnt)

def dfs2():
    if cnt == 5:
        print(cnt)

cnt = 5
dfs1()
dfs2()
print(cnt)

def dfs1():
    cnt = 3
    print(cnt)

cnt라는 변수를 만들고, 그곳에 3이라는 값을 할당한다.

이렇게 된다면 cnt라는 변수는 dfs1()의 지역변수가 되는 것이다.

결국 예제의 소스코드 출력은

3
5
5

로 나온다.

예제3 (전역변수, 지역변수 느낌 global)

«소스코드 예제»

def dfs1():
    cnt = 3
    print(cnt)

def dfs2():
    if cnt == 5:
        # 추가한 정보
        cnt = cnt + 1
        print(cnt)

cnt = 5
dfs1()
dfs2()
print(cnt)

def dfs2():
    if cnt == 5:
        cnt = cnt + 1
        print(cnt)

파이썬의 인터프리터로 언어 번역을 했을 때, dfs2() 함수 조건문 안에 cnt라는 변수를 선언 하여 cnt + 1로 넣었다.
(즉, 지역변수를 선언했다.)

하지만 cnt 지역변수로 선언 했지만, if cnt == 5: 를 실행하기 전에 cnt 변수에 값이 없기 때문에 에러가 나온다.

로 나온다.

하지만 위와 같이 코드를 짤 경우 우리는 cnt라는 변수가 전역변수라는 가정으로 짠다.

이럴 경우 “cnt가 전역변수이다. “ 라고 함수에게 알려주면 된다.

def dfs2():
    global cnt
    if cnt == 5:
        # 추가한 정보
        cnt = cnt + 1
        print(cnt)

위의 dfs2() 함수에서 cnt의 전역변수를 +1로 더해줬기 때문에 cnt는 6이 된다.

결국 예제의 소스코드 출력은

3
6
6

로 나온다.


파이썬 리스트

파이썬의 리스트는 지역변수로 잡히지 않고, 전역 변수로 잡힌다.

예제1 (리스트)

«소스코드 예제»

def dfs():
    a[0] = 7
    print(a)

a = [1, 2, 3]
dfs()
print(a)

아래 코드는 dfs() 함수의 내용이다.

def dfs():
    a[0] = 7
    print(a)

여기서 a[0] = 7 의미는 변수를 할당하는게 아니라 전역리스트의 인덱스 값을 변경한다 라는 ‘참조’라고 생각하면 된다.

그래서 출력은

[7, 2, 3]
[7, 2, 3]

이 된다.


예제2 (리스트)

«소스코드 예제»

def dfs():
    a = [7, 8]
    print(a)

a = [1, 2, 3]
dfs()
print(a)

아래 코드는 dfs() 와 같이 a라는 리스트를 새로 선언한다면 a라는 리스트는 지역리스트가 되는 것이다!

def dfs():
    a = [7, 8]
    print(a)

그래서 출력은

[7, 8]
[1, 2, 3]

이 된다.


예제3 (리스트 오류 뜨는 경우)

«소스코드 예제»

def dfs():
    a = a + [4]
    print(a)

a = [1, 2, 3]
dfs()
print(a)

아래 코드는 a라는 리스트를 새로 선언하는데 a 라는 리스트에 + [4] 를 하는 것이다.

def dfs():
    a = a + [4]
    print(a)

이때 ‘언어번역’에서 a를 지역변수로 선언하여 그 안에 값을 넣으려고 하는데 a를 더한다고 하니

하지만 그전에 지역변수 a는 정의가 되어 있지 않기 때문에 문제가 생긴다.

애러를 방지하기 위해서는

def dfs():
    global a
    a = a + [4]
    print(a)

로 하면 된다.

댓글남기기