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]이다
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 |
댓글 영역