사전지식
▶if name =="__main__": 메인 스크립트 안에 있는 변수는 전역변수
▶즉 if문 아래에 있는 cnt는 전역 변수
▶cnt = 5의 의미 : 변수생성과 할당을 동시에 함
▶전역변수는 모든 함수가 접근가능
▶함수안에 있는 지역변수는 자신이 함수 안에 있는 지역 변수 인지 확인을 한다. 함수 안에 있으면 지역변수를 사용한다.
▶함수의 공간에 지역변수가 없는 경우 전역변수를 가져와서 쓴다.
CASE 1
'''전역변수와 지역변수'''
def DFS1():
print(cnt)
def DFS2():
if cnt ==5:
print(cnt)
if __name__== "__main__": #스크립트실행시 가장 먼저 실행
cnt = 5
DFS1()
DFS2()
print(cnt)
실행결과
해설
DFS1 함수 안에는 cnt 로컬변수가 없다. 따라서 전역변수 cnt를 가져와서 5를 출력한다.
DFS2 함수 안에는 cnt 로컬변수가 없다. 따라서 전역변수 cnt를 가져와서 5를 출력한다.
main 함수 안에는 cnt 전역변수가 있다. 따라서 전역변수 cnt 즉 5를 출력한다.
CASE 2
'''전역변수와 지역변수'''
def DFS1():
cnt=3
print(cnt)
def DFS2():
if cnt ==5:
cnt=cnt+1
print(cnt)
if __name__== "__main__": #스크립트실행시 가장 먼저 실행
cnt = 5
DFS1()
DFS2()
print(cnt)
실행결과
해설
DFS1 함수 안에는 cnt 로컬변수가 3이 있다. 따라서 3을 출력한다.
DFS2 함수에서
cnt =cnt +1 하는 경우 인터프리터가 우측 cnt 와 좌측 cnt를 모두 로컬 변수로 해석하고,
윗줄에 있는 if문의 cnt ==5 에서 cnt도 로컬변수로 해석해 버린다.
if문의 cnt는 로컬변수인데, 값은 할당받은 받기 전에 비교를 하므로 에러가 발생한다.
이러한 에러를 방지하기 위해서
아래와 같이 if문 위에 global cnt를 적어주는 경우 DFS2() 함수 내에 있는 모든 cnt는 전역변수로 작용한다.
def DFS2():
global cnt
if cnt ==5:
cnt=cnt+1
print(cnt)
따라서 cnt+1로 인하여 전역변수는 6이 되고, DFS2()에서 cnt는 6이 출력된다.
DFS2() 함수가 종료된 경우에는 전역변수인 cnt가 최종적으로 6으로 바뀌었으므로 메인함수에서 cnt=6이 출력된다.
if __name__== "__main__": #스크립트실행시 가장 먼저 실행
cnt = 5
DFS1()
DFS2()
print(cnt) #전역변수 6이 출력된다.
CASE 3
'''전역변수와 지역변수'''
def DFS():
a[0] = 7
print(a)
if __name__== "__main__":
a = [1, 2, 3]
DFS()
print(a)
실행결과
[ 7, 2, 3 ]
[ 7, 2, 3 ]
해설
a[0] =7 ※새로운 로컬 리스트a가 생성되지 않는다.
전역 a리스트의 0 인덱스에 7을 대입한다.
CASE 4
'''전역변수와 지역변수'''
def DFS():
a= [7,8]
print(a)
if __name__== "__main__":
a = [1, 2, 3]
DFS()
print(a)
실행결과
[ 7, 8 ]
[1, 2, 3 ]
해설
함수 안에 있는 a =[ 7,8 ] 에서 a는 로컬리스트이다.
CASE 5
'''전역변수와 지역변수'''
def DFS():
a= a+[4]
print(a)
if __name__== "__main__":
a = [1, 2, 3]
DFS()
print(a)
실행결과
해설
a=a + [4]
위와 같은 경우 인터프리터가 우측에 있는 a와 좌측에 있는 a를 로컬리스트로 해석한다.
그런데 우측에 있는 로컬리스트a는 할당된 적이 없으므로 에러가 난다.
이를 방지 하기 위해서는 아래와 같이 global a를 적어주면 DFS() 안에 a는 전역리스트가 된다.
def DFS():
global a
a= a +[4]
print(a)
if __name__== "__main__":
a = [1, 2, 3]
DFS()
print(a)
따라서 DFS 함수에서 전역리스트 a가 바뀌었으므로 [1, 2, 3, 4]가 출력되고,
최종적으로 메인함수에서 바뀐 전역리스트 [1, 2, 3, 4]가 이 출력된다.
'파이썬 알고리즘 > 알고리즘 직빵 파이썬 문법' 카테고리의 다른 글
재귀함수 처리 후 후속작업 (0) | 2022.11.09 |
---|---|
branch(자식) 만들기 by DFS (0) | 2022.11.09 |
리스트 기호 없이 출력하기 (0) | 2022.11.05 |
튜플 vs 튜플이 들어간 리스트 (0) | 2022.11.03 |
index에 대하여 (0) | 2022.10.30 |