1. 객체 (Object)
파이썬에서 다루는 모든 데이터는 객체(object)이다. 정수, 실수, 문자열, 사용자 정의 클래스의 인스턴스 등 모든 것은 특정 타입(자료형)을 가지고 메모리에 상주하는 객체들인 것이다. 각 객체는 메모리상에서의 위치를 나타내는 고유한 ID 값을 지니고 있으며, 파이썬에서의 변수는 그러한 객체들을 가리키는 레퍼런스일 뿐이다. Java에서의 객체를 가리키는 참조 변수와 그 성격이 유사하다.
2. 객체 관련 도구 (함수, 연산자)
관련 도구 | 분류 | 설명 |
id(객체) | 내장 함수 | 객체의 ID 값 확인 |
is | 연산자 | 두 객체의 ID 값 비교 |
== | 연산자 | 두 객체의 값 비교 (권장) |
= | 연산자 | 우변의 객체를 좌변의 변수가 가리키도록 함 |
3. immutable 객체
파이썬의 immutable 타입:
bool
, int
, float
, str
, tuple
, bytes
등값의 변경이 불가능한 객체를 의미한다. 값의 변경을 시도할 경우, 새 값을 가진 객체를 메모리에 새로 생성하여 이를 가리키게 된다.
기본적으로 어떤 값을 쓰면 그 값이 이전에 썼던 값과 동일하더라도 그 값을 가진 객체를 재활용 가능한 공간에 매번 새로 생성한다. 만약 그 값이 특정 변수에 대입되지 않았다면(아무 변수도 해당 객체를 가리키지 않는다면) 다음에 또 다른 값을 썼을 때 해당 객체가 차지하고 있던 공간을 재활용할 수 있고, 대입되었다면 다른 공간을 사용할 것이다. 그래서 가급적이면 데이터를 비교할 때는
is
연산자보다는 ==
연산자를 사용하는 것을 권장한다. 같은 값이어도 참조값이 다를 수 있기 때문이다.그러나 immutable 객체의 경우, 동일한 값을 쓸 경우 새로운 객체를 매번 새로 생성하는 것보다는 이미 존재하는 객체를 가리키는 편이 효율적이다. 값의 변경이 가능하다면 기존 객체를 가리키게 하는 것이 위험하겠지만, immutable 객체는 값의 변경이 불가능하기 때문이다. 그래서 파이썬에서는 immutable 타입마다 값이 캐시 되는 특정 기준을 정해놓고, 캐시 되어 있는 값이라면 이미 존재하는 객체를 가리키도록 하고 있다. 다음은 대표적인 immtuable 타입들의 캐시 기준을 간단하게 보여준다.
int
: -5 ~ 256 사이의 값
float
: 캐시가 되지 않음
str
: a ~ z, A ~ Z, 0 ~ 9, _ 문자로만 구성된 문자열 (* 예외 존재)
tuple
: 캐시가 되지 않음
문자열의 경우, 캐시의 예외 상황이 꽤 있어서 캐시가 되지 않는 편으로 기억하고 있는 것이 편할 수도 있다. 문자열을 조합하여 새로운 문자열을 만들어내면 그 값이 캐시 대상의 문자로만 구성된 이전 값과 동일하더라도 매번 새로운 객체를 생성하고,
input()
함수 등을 이용하여 키보드로 입력받은 값도 캐시 대상의 문자로만 구성된 이전 값과 동일하더라도 매번 새로운 객체를 생성한다. 만약 동일한 문자열을 항상 동일한 객체로 처리하고 싶다면 sys.intern(객체)
함수를 사용하면 된다.참고로,
NoneType
타입의 None
객체와 bool
타입의 True
, False
객체는 메모리에 유일하게 딱 하나씩만 상주해 있기 때문에 이 값들은 쓸 때마다 객체를 새로 생성하지 않는다. 이러한 이유로 None
, True
, False
의 경우 ==
이 아닌 is
로 비교하는 것이 권장된다.4. mutable 객체
파이썬의 mutable 타입:
list
, dict
, set
, bytearray
등값의 변경이 가능한 객체를 의미한다. 값의 변경을 시도할 경우, 가리키고 있는 객체의 값을 바꾸게 된다.
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.