2016-06-15 4 views
2
내가 (CPython의 2.7 및 3.5)이 행동의 이유가 될 수 있는지 궁금하네요

: 21 개 문자보다 짧은CPython의 문자열 - 메모리 할당

>>> a = 's' ; b = 's' 
>>> id(a), id(b) 
(4322870976, 4322870976) 

문자열 같은 메모리 주소를 공유 할 것 (또는 id).

>>> a = 's' * 20 ; b = 's' * 20 
>>> id(a), id(b) 
(4324218680, 4324218680) 

21에서이 동작이 변경됩니다.

>>> a = 's' * 21 ; b = 's' * 21 
>>> id(a), id(b) 
(4324218536, 4324218608) 

내가 python docs 따라 합리적인 설명을 찾을 수 없습니다, 그러나 :

예를 들면, 후 = 1; B = 1, A와 B 또는이 결정이된다, 내가 찾을 수 없습니다 cpython's code 찾고 후 ... 구현에 따라, 값 하나와 같은 객체를

을 참조하지 않을 수 있습니다.

답변

3

파이썬 컴파일러 converts은 가능한 한 많은 표현식과 바이트 코드 내에서 상수 (즉, 인턴이 그것들)에 의미가 있습니다. 동일한 값을 가진 상수는이 과정을 통해 같은 id()이됩니다. 이것은 첫 번째와 두 번째 예제에서 결과를 제공합니다.

하지만 우리는 "이해할 수 있어야합니다." 크기가 큰 식 (예 : 10**100)을 사용하면 일정한 결과에 많은 공간이 사용됩니다. 즉, 컴파일러는 바이트 코드에 수정되지 않은 표현식을 포함하고 런타임에 해당 값을 계산합니다. 문자열의 경우 (실제로 모두 유형) 최대 길이는 20이므로 세 번째 예의 표현식은 컴파일러가 아닌 VM에 의해 평가됩니다.

+0

20 세 이상의 이유는 무엇입니까? –

+0

찾을 수 없습니다. –