상세 컨텐츠

본문 제목

전역 변수와 지역 변수

Algorithm/inflearn python algorithm

by 개복신 개발자 2021. 8. 10. 12:02

본문

728x90
반응형
def DFS1():
    print(cnt)

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

if __name__=="__main__":
    cnt=5
    DFS1()
    DFS2()
    print(cnt)

-위의 출력값은 5, 5, 5이다

cnt=5로 전역 변수로 모든 함수에 적용된다

 


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

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

if __name__=="__main__":
    cnt=5
    DFS1()
    DFS2()
    print(cnt)

-DFS1()에서 cnt=3으로 지역 변수(local)로 선언되어 5로 출력되지 않는다

출력값은 3, 5, 5이다

 


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

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

if __name__=="__main__":
    cnt=5
    DFS1()
    DFS2()
    print(cnt)

-에러 발생

DFS2()에서 cnt+=1을 작성하면 cnt는 함수 내부의 지역 변수로 바뀐다. 따라서 DFS2()함수를 돌릴 때 처음에 cnt는 정의 되지 않았기 때문에 cnt==5가 성립할 수 없어서 위의 코드에서 에러가 뜬다.


-에러 해결

DFS2()함수 첫째 줄에 global cnt로 작성하면 cnt는 함수 내에서도 전역 변수로 간주되기 때문에

에러가 뜨지 않는다

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

def DFS2():
    global cnt
    if cnt==5:
        cnt+=1
        print(cnt)

if __name__=="__main__":
    cnt=5
    DFS1()
    DFS2()
    print(cnt)

-출력 값은 3, 6, 6이다

DFS2()함수 내에서 cnt가 1이 더해지는데 이때가 전역 변수이므로 main부분에서도 적용이 되는 것이다.


이제 리스트의 경우를 살펴보자. 리스트도 함수 내에서 정의될 수 있고 함수 밖에서 정의될 수 있다. 그러나 변수를 선언하는 것과 차이점이 존재한다.

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

if __name__=="__main__":
    a=[1,2,3]
    DFS()
    print(a)

-위 코드의 출력 값은 [7,2,3], [7,2,3]이다

함수 DFS()내부에서 a[0]=7은 새로운 지역 리스트를 생성한 것이 아니라 기존의 리스트에서 일부만 변경한 것이기에

main부분에서도 똑같이 수정 부분이 적용된다.

변수와 다른 이유는 함수 내에서 변수를 다시 정의할 경우 새로운 지역 변수를 생성한 것으로 판단하기 때문에 global 함수를 따로 작성해야 한다. 그러나 리스트는 생성하는 것이 아니라 수정하는 것으로 해석하므로 위와 같은 결과가 나온다

 

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

if __name__=="__main__":
    a=[1,2,3]
    DFS()
    print(a)

-함수 내에서 생성하는 케이스

앞의 경우와 다르게 이 코드에서는 함수 내부에서 리스트 a를 생성하였다. 따라서 출력값은 [7,8], [1,2,3]이다

함수 내부에서의 값이 출력되고 함수 부분은 고려하지 않는다. 지역 리스트이기 때문이다. 함수가 끝나면 판단할 필요가 없고 다시 main 부분으로 가서 코드를 실행한다

 


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

if __name__=="__main__":
    a=[1,2,3]
    DFS()
    print(a)

-에러 발생

위의 코드에서는 에러가 뜬다.

a라는 리스트가 지역 리스트로 간주되는데 함수 첫줄에 a에 대한 정의가 쓰여 있지 않기 때문에 오류가 뜨는 것이다

 

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

if __name__=="__main__":
    a=[1,2,3]
    DFS()
    print(a)

-에러 해결

global a 코드를 추가해서 모든 a에 관한 리스트를 전역 리스트로 변환한다.

출력값은 [1,2,3,4], [1,2,3,4]이다

반응형

'Algorithm > inflearn python algorithm' 카테고리의 다른 글

6.6 중복 순열 구하기(DFS)  (0) 2021.08.11
6.5 바둑이 승차(DFS)  (0) 2021.08.10
6.4 합이 같은 부분 집합 (DFS)  (0) 2021.08.09
6.3 부분 집합 구하기(DFS)  (0) 2021.08.09
6.2 이진트리순회  (0) 2021.08.09

관련글 더보기

댓글 영역