내가 좋아하는 코믹스 영화 시리즈인 『엑스맨』.
돌연변이들을 '뮤턴트'라고 한다.
python 의 특징 중 하나는 immutable(변할 수 없는) 타입과 mutable(변할 수 있는) 타입이 있다는 점이다.
bytes
: immutable |bytearray
: mutable
tuple
: immutable |list
: mutable
frozenset
: immutable |set
: mutable
이렇게 immutable 타입에 대응하는 mutable 타입이 꼭 있다.
재할당이란? (re)bind
이미 선언된 이름의 값을 변경하는 것이다. 메모리 값이 바뀐다.
a라는 identifier 에 3을 할당하고 확인한 주소값 id(a)
과
다시 2를 할당한 뒤 확인한 주소값이 다름을 알 수 있다.
a의 값이 변할 때마다 메모리를 재할당해줬다는 뜻이다.
결국 mutable 타입이 있는 이유는 성능적인 이점 때문이다.
만약에 loop 를 돌면서 immutable 한 객체의 값을 순회하면서 값을 변경한다고 치면, 이건 단순하게 변경이 아니라 매번 재할당을 하기 위해서 객체를 계속 생성한다.
그러다보면, 메모리에서 객체들이 차지하는 비중이 점점 커지면서, 너무 규모가 커지면 메모리 문제로 인해 소스코드가 작동하지 않는 상황이 올 수도 있다.
만약, mutable 한 객체에 매번 값을 새롭게 할당하면, 새로운 메모리공간을 차지하지 않으면서 값을 변경한다.
이렇게 재할당 없이 값을 바꾸는걸 inplace 테크닉이라고 한다.
잘 사용하면 편리하지만, 못 사용하면 문제점이 많다.
그래서 함수형 프로그래밍 언어에서는 아예 mutable 이라는 타입이 없는 프로그래밍언어가 많다. (ex. TensorFlow 등 ...)
이런 문제를 피하며 잘 사용하기 위해서는 데이터타입이 어떤 성질을 갖고 있고 어떤 타입인지를 잘 파악하고 있어야 한다.
그렇지 않으면 surprising한 결과를 맞닥뜨리게 되니..!
마지막 코드의 출력값은?
바로 >>> ['Python', 'Java'] 이다.
surprising effect 가 이걸 말하는거다. ujin 이라는 객체에는 넣은 적 없는 게 들어있는거다.
↑ 참고한 영상