본문 바로가기
Programming/python

[python] python 의 변수들

by 단창 2014. 2. 25.


파이썬은 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의 개념이라는것을 염두해 두어야지 실수 하지 않겠다. 


반응형