회사에서 파이썬을 사용한다. 덕분에 파이썬 고수들이 많다. 그 덕에 찾아도 못 찾는 지식들의 해답을 찾을 수 있어서 좋다. 이번 것도 그 중의 하나이다.
내게 알려준 분은 예제 코드를 제시하면서 설명해줬는데, 백문이 불여일견이었다. 이 둘은 사실 용법 차이이며, 왜 다른지 인식하려면 그 편이 명확하다.
좌측은 객체가 생성되었다. 우측은 참조의 값을 바꾼 셈이 되었다.
파이썬의 디스어셈블리 모듈(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 |