본문 바로가기
코드

파이썬에서 A = [1,2,3]와 A[:] = [1,2,3]의 차이

by ehei 2012. 3. 13.

회사에서 파이썬을 사용한다. 덕분에 파이썬 고수들이 많다. 그 덕에 찾아도 못 찾는 지식들의 해답을 찾을 수 있어서 좋다. 이번 것도 그 중의 하나이다.

 

A = [1, 2, 3]과 A[:] = [1, 2, 3] 은 어떤 차이가 있을까. 한 동안 나는 이것이 어째서 다른지 이해되지 않았다. 그렇다고 검색 엔진에 조회하기도 애매한 질문이다.

 

내게 알려준 분은 예제 코드를 제시하면서 설명해줬는데, 백문이 불여일견이었다. 이 둘은 사실 용법 차이이며, 왜 다른지 인식하려면 그 편이 명확하다.



 

좌측은 객체가 생성되었다. 우측은 참조의 값을 바꾼 셈이 되었다.

 

파이썬의 디스어셈블리 모듈(dis)을 사용하면 좀더 확연히 알 수 있다. 아래 그림에서 31 STORE_FAST를 보자. a에 새로운 주소가 할당되었다. 이로 인해 a와 b의 객체 id가 분리되었다.



 

다시 아래 그림을 보자. 31~40을 통해 a의 부분 집합이 생성되었다. 그리고 43 STORE_SUBSCR를 통해 값이 복사되었다. 따라서 b에도 같은 값이 들어있다.




파이썬의 처리 방식이 잘 이해되지 않으면 dis 모듈을 사용하면 좀 더 명확히 파악할 수 있다. 또한 컬렉션 복사는 주의하고 또 주의하도록 하자. 참조 방식이라는 것이 사실 잘 안 보인다. 덕택에 실수하기 좋다. C++의 참조에서도 그런 실수를 몇 번 했다. 인자로 받은 참조를 함수에서 변경해버린다든지... 그 덕에 참조는 가능한 철저히 상수로 선언하는 습관을 들였다. 그런데 파이썬은 이게 되지 않는다. 어쩌면 있을 수도 있겠지만, 매뉴얼을 읽던 도중에는 없었다. 주의하고 또 주의하자 ^^

'코드' 카테고리의 다른 글

ACM 674, Coin Change  (0) 2013.01.09
다시 해본 동전 문제  (0) 2013.01.09
회문 숫자 식별하기  (0) 2012.01.14
셀프 넘버들의 합 구하기  (0) 2012.01.14
던젼 생성 2/2  (0) 2010.08.16