파이썬 데이터는 객체다

컴퓨터 메모리를 일련의 긴 선반으로 생각할 수 있습니다. 해 당 메모리 선반 중 각 슬롯은 폭이 1바이트 입니다. 파이썬 프로그램은 운영체제에서 컴퓨터의 일부 메모리에 접근할 수 있습니다. 이 메모리는 프로그램 자체의 코드와 데이터를 위해 사용될 수 있습니다. 파이썬은 값을 직접 처리하는 대신, 메모리에 객체로 래핑합니다.

타입

이름 타입 가변
불리언 bool 불변
정수 int 불변
부동소수점 float 불변
복소수 complex 불변
문자열 str 불변
튜플 tuple 불변
바이트 bytes 불변
프로즌 셋 frozenset 불변
리스트 list 가변
바이트 배열 bytearray 가변
set 가변
딕셔너리 dict 가변

가변성

값을 변경할 수 있는 경우를 가변성이라고 합니다. 그러나 파이썬은 강타입 언어이기 때문에 타입을 변경할 수는 없습니다. 즉 객체가 가변성인 경우 값은 변경 가능하지만, 타입은 변경할 수 없습니다. (타입 변경을 하면 무조건 새로운 메모리에 객체가 새로 생성된다는 얘기입니다)

참조

변수에 값을 할당할 때 알아야 할 중요한 사실은 할당은 값을 복사하는 것이 아니라, 단지 객체에 이름을 붙이는 것입니다. 이를 변수를 통해 객체를 참조한다라고 합니다. 또 한가지 중요한 사실은 왼쪽 그림에서 b가 참조하고 있던 값을 변경하면 정수는 불변 객체이기 때문에 새로운 값이 메모리에 생성되고 b는 새로운 값을 참조하지만,오른쪽 그림과 같이 가변 객체는 말 그대로 값을 변경할 수 있기 때문에 자신이 참조하고 있던 값을 변경해도 새로운 메모리에 값이 생성되는 것이 아니라 데이터 값을 그 자리에서 바꾸게 됩니다.

그럼 만약 불변 객체는 값을 바꿀 때 마다 메모리에 새로운 데이터를 생성하게 되는데 그러면 메모리가 엄청 낭비되지 않을까 라는 생각을 할 수 있습니다. 이를 해결해 주기 위해 파이썬에는 가비지 컬렉터가 있고 이는 더 이상 참조되지 않는 객체를 메모리에서 삭제될 수 있도록 도와줍니다.

복사

변수의 대입을 통한 복사

immutable한 객체인 숫자, 부울, 문자열, 튜플 등의 경우에는 변수의 대입을 통해 복사가 가능합니다.

하지만 다음과 같이 mutable한 객체의 경우에는 복사가 안되고 값이 같이 변경되게 됩니다.

얕은 복사

또 하나의 가능한 복사 방법은 얕은 복사입니다. 얕은 복사는 mmutable한 객체에 대해서도 복사가 됩니다. 하지만 이 또한 문제가 발생하는 경우가 있습니다.

예를 들어 리스트와 같은 가변 객체 안에 또 가변 객체가 있게 되고 그 원소를 수정하려고 하면 진짜 복사가 아니었던 것이 드러나게 됩니다. 밑에 그림을 보게 되면 가변 객체 안에 있는 가변 객체 원소를 수정하게 되면 새로운 메모리에 할당하지 않고 그냥 바꾸기 때문에 가만히 있던 변수까지 참조하고 있는 객체의 값이 덩달아 바뀌게 됩니다.

깊은 복사

따라서 이러한 경우에 필요한 것이 바로 깊은 복사입니다.

Tags:

Categories:

Updated: