Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 불변(immutable) 문자열의 id 값은 어떻게 달라질 수 있을까?

Python 문자열은 불변(immutable)입니다

Python에서 문자열은 불변(immutable) 객체입니다. 즉, 한 번 생성된 문자열은 그 내용을 변경할 수 없습니다. 흥미로운 점은, 동일한 내용의 문자열을 만들어 다른 변수에 할당하면 두 변수가 같은 메모리 위치(같은 문자열 객체)를 가리킨다는 것입니다.

다음 예제를 살펴보겠습니다.

>>> a = 'hi'
>>> b = 'hi'
>>> id(a)
43706848L
>>> id(b)
43706848L

문자열 인터닝(String Interning)이란?

이처럼 동일한 문자열 객체를 재사용하는 메커니즘을 Python에서는 인터닝(interning)이라고 부릅니다. 덕분에 같은 내용의 문자열은 동일한 id() 값을 갖게 됩니다. 이는 메모리 사용량을 줄이고 문자열 비교 성능을 높이기 위한 최적화 기법입니다.

하지만 주의할 점이 있습니다. Python은 모든 문자열에 대해 인터닝을 보장하지 않습니다. 코드 객체의 상수(constant)로 취급되지 않거나, 알파벳·숫자·언더스코어(_) 범위를 벗어난 문자가 포함된 문자열을 생성하면 id() 값이 재사용되지 않는 것을 확인할 수 있습니다.

특수 문자가 포함된 문자열의 id 확인하기

실제로 알파벳, 숫자, 언더스코어 외의 문자가 포함된 문자열을 서로 다른 두 변수에 할당하면 어떻게 되는지 살펴보겠습니다.

>>> a = 'weworks_45#@$'
>>> b = 'weworks_45#@$'
>>> id(a)
96226208L
>>> id(b)
91720800L

위 예제에서 볼 수 있듯이, 두 변수 ab는 같은 내용의 문자열을 담고 있지만 서로 다른 id 값을 가집니다. 그 이유는 해당 문자열에 #, @, $와 같은 특수 문자가 포함되어 있어 인터닝 대상에서 제외되었기 때문입니다.

정리

결국 문자열 자체는 여전히 불변이며, 실제로 "id를 변경"하는 것이 아니라 동일한 내용의 문자열이라도 조건에 따라 별개의 객체로 생성될 수 있다는 점이 핵심입니다. 일반적인 식별자 형태(알파벳, 숫자, 언더스코어)의 문자열은 인터닝을 통해 같은 객체를 공유하지만, 특수 문자가 포함된 문자열은 매번 새로운 객체로 만들어져 서로 다른 id를 갖게 됩니다.