파이썬은 메모리의 효율적인 사용을 위해 특정한 문자 영역의 값을 동일한 메모리 주소값에 할당한다. 특정한 문자 영역의 값은 다음과 같다.
-5 ~ 256 범위의 정수
y = -7 for x in range(-7, 260): if x is not y: print("id(%3s): %s id(%3s): %s" %(x, id(x), y, id(y))) print(id(x) - id(y)) y = y + 1
id( -7): 140475708734192 id( -7): 140475710813008 -2078816 id( -6): 140475710813008 id( -6): 140475710812528 480 id(257): 140475710813008 id(257): 140475708734192 2078816 id(258): 140475708734192 id(258): 140475710813136 -2078944 id(259): 140475710813136 id(259): 140475710813264 -128
[a-zA-Z0-9_]에 해당하는 char가 연결된 문자열
# [a-zA-Z0-9_]에 해당하는 랜덤한 문자열의 조합 st1을 반환한다. iimport random rand = str() for _ in range(50): rand = rand + random.choice("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_") # 만들어진 랜덤한 문자열의 조합을 확인한다. >>> print("rand: %s" %(rand)) QcsirWWJGjcEvdD2bBtxWE_spCjwr3xdCSwBEyYXz3rkSb5lVN >>> print("id(rand): %s" %(id(rand))) id(rand): 140475710842000 # 만들어진 랜덤한 문자열의 조합을 새로운 변수 st1과 st2에 할당한다. st1 = "QcsirWWJGjcEvdD2bBtxWE_spCjwr3xdCSwBEyYXz3rkSb5lVN" st2 = "QcsirWWJGjcEvdD2bBtxWE_spCjwr3xdCSwBEyYXz3rkSb5lVN" # 같은 메모리 영역을 가리키고 있는 것을 확인할 수 있다. >>> print("id(st1): %s" %(id(st1))) id(st1): 140475710819776 >>> print("id(st2): %s" %(id(st2))) id(st2): 140475710819776 # 반면 띄어쓰기나 다른 특수문자가 들어간 문자열의 조합은 서로 다른 메모리 주소값에 저장되어 있음을 알 수 있다. a = "Hello, world!" b = "Hello, world!" >>> print("id(a): %s" %(id(a))) 140475708991408 >>> print("id(b): %s" %(id(b))) 140475708989616
그런데 위의 규칙 외에도 같은 메모리 주소값을 가리킬 수 있다. 아래 예를 보자. 컴파일 시점에서 동일한 값임을 알고 있기 때문에 컴파일러는 서로 다른 두 변수를 같은 메모리 주소값에 할당하게 된다.(Jupyter Notebook에서는 다른 메모리 주소값을 반환한다. 아래는 IDLE에서 실행한 결과이다.)
a = "Hello, world!"; b = "Hello, world!" >>> print("id(a): %s" %(id(a))) 4361010032 >>> print("id(b): %s" %(id(b))) 4361010032