파이썬은 C 와는 다르게 기본적으로 변수가 가르키는 것은 모두 reference개념이다.
포인터의 개념과 같다.
즉
A = [ 1 2 3 ]
B = A
C = A
B[0] = 4
이렇게 하면
A[0]과 C[0]도 모두 4로 바뀌게 된다.
A, B, C 는 모두 같은 변수를 가르키는 주소이다.
같은 메모리를 가르키고 있는지 확인하는 python명령어인 is 를 사용해서 확인해 볼수 있다.
A is B
A is C
B is C
모두 True가 반환된다.
그러면 A와 B가 같은 내용을 담고 다른 메모리번지를 가르키게 하려면 어떻게 해야 할까?
B = A[:]
C = A[:]
이렇게 해주면된다.
리스트의 전체를 가르키는 :를 사용해 줌으로서 가능하다. A의 전체내용을 B에 넣으란 뜻이다.
아니면,
import copy from copy
B = copy(A)
라고 할 수도 있다. 이것은 B= A[:]
와 동일하다.
그렇다면 이 경우엔 어떨까?
A = 3
B = 3
A is B
하면 결과로
True가 나온다.
B = 4
이러면 A도 바뀌게 될까?
A 는 여전히 3으로 남아있다.
이 이유는 A와 B는 int 변수로서 같은 메모리를 가르켰으나
B = 4하는 순간, A와 B가 가르키는 메모리의 내용을 4로 바꾸는 것이 아니라,
B를 4가 있는 메모리로 재정의 한 것이다.
따라서 list인 경우에는 C와는 다르게 항상 reference의 개념이라는것을 염두해 두어야지 실수 하지 않겠다.
반응형
'Programming > python' 카테고리의 다른 글
Numpy arrary 구조 이해하기 (0) | 2018.09.05 |
---|---|
[python] thread mangement (0) | 2014.06.27 |
[python] variable 이 존재하는지 check 하는 방법 (0) | 2014.02.25 |
python thread (0) | 2013.08.21 |
python 파이썬 파일 이름 변경 filename change (0) | 2012.09.25 |