Thief of Wealth
Published 2019. 3. 24. 02:58
python 유효범위 개발/Python

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
profile on loading

Loading...