js의 var과 python의 multiple object가 아닌이상
모든 변수는 선언된 구간 내의 scope를 가진다.
예를 들어보자
1.
a = 2
def test():
a = 3
print( a,id(a))
test()
print(a,id(a))
위와 같은 경우는 a와 b의 값이 다르고 객체의 주소가 까지 다른 것을 알 수 있다.
2.
a = 2
def test():
print("inside test", a,id (a) )
test()
print("after test", a, id(a))
뭔가 실패할 것만 같다. 그러나 둘다 똑같은 a가 출력된다.
print는 동작할때 전역범위 (외부범위)를 스캔하고 내부를 스캔하기 때문이라고 한다.
3.
a = 2
def test():
a+=1
print("inside test", a,id (a) )
test()
print("after test", a, id(a))
에러가 난다.
print 함수 내부에 print만 있었다면 에러가 나지 않았을 테지만,
a+=1같은 연산은 지역변수를 찾지 못해 에러가 난다.
4.
a = 2
def test():
print("inside test", a)
a = 3
test()
print("after test", a)
3번의 논리라면 print는 에러가 나지 않고 a=3에서 에러가 나야하지만 print에서 에러가 난다. 왜?
a=3이 선언되어있으므로 python은 a가 더이상 전역변수가 아니라 지역변수라고 인식한다.
그래서 선언되기전에 사용되었다는 에러를 발생시킨다.
5.
a = 2
def test():
global a
print("inside test", a)
a = 3
test()
print("after test", a)
가장 권장하는 방법이다. (인수전달이 더 보기 좋겠지만)
함수 내에 global a를 선언한 시점에서 python은 외부의 a를 마치 인수로 가져온것처럼 함수 내부에서 사용할 수 있다.
당연히 함수 내부에서 값을 바꾸면 외부에서도 값이 바뀐다.
그래서 2,3이 출력된다.
'개발 > Python' 카테고리의 다른 글
python 조합 (0) | 2019.03.24 |
---|---|
python 순열 (0) | 2019.03.24 |
python join함수 (0) | 2019.03.24 |
python Swap (0) | 2019.03.24 |
python 배열에서 열출력하기 (0) | 2019.03.23 |