파이썬 문자열 인턴
이 질문은 실제로 실제로 사용되지는 않지만 파이썬이 문자열 인턴을 어떻게 수행하는지 궁금합니다. 나는 다음을 알아 차렸다.
>> "string" is "string"
>> True
이것은 내가 예상했던 것입니다.
이것을 할 수도 있습니다.
>> "strin"+"g" is "string"
>> True
그리고 그것은 꽤 영리합니다!
그러나 당신은 이것을 할 수 없습니다.
>> s1 = "strin"
>> s2 = "string"
>> s1+"g" is s2
>> False
왜 파이썬은 평가하지 것 s1+"g"
, 그것은과 동일 실현 s1
과 같은 주소를 가리? 마지막 블록에서 실제로 무슨 일이 일어나고 False
있습니까?
이것은 구현에 따라 다르지만 인터프리터는 아마도 컴파일 타임 상수를 인터 닝하지만 런타임 식의 결과는 아닙니다.
다음에서는 CPython 2.7.3을 사용합니다.
두 번째 예에서 표현식 "strin"+"g"
은 컴파일 타임에 평가되고 "string"
. 이렇게하면 처음 두 예제가 동일하게 작동합니다.
바이트 코드를 살펴보면 정확히 똑같다는 것을 알 수 있습니다.
# s1 = "string"
2 0 LOAD_CONST 1 ('string')
3 STORE_FAST 0 (s1)
# s2 = "strin" + "g"
3 6 LOAD_CONST 4 ('string')
9 STORE_FAST 1 (s2)
세 번째 예는 런타임 연결을 포함하며 그 결과는 자동으로 인턴되지 않습니다.
# s3a = "strin"
# s3 = s3a + "g"
4 12 LOAD_CONST 2 ('strin')
15 STORE_FAST 2 (s3a)
5 18 LOAD_FAST 2 (s3a)
21 LOAD_CONST 3 ('g')
24 BINARY_ADD
25 STORE_FAST 3 (s3)
28 LOAD_CONST 0 (None)
31 RETURN_VALUE
intern()
세 번째 표현식의 결과 를 수동으로 가져 오면 이전과 동일한 객체를 얻게됩니다.
>>> s3a = "strin"
>>> s3 = s3a + "g"
>>> s3 is "string"
False
>>> intern(s3) is "string"
True
사례 1
>>> x = "123"
>>> y = "123"
>>> x == y
True
>>> x is y
True
>>> id(x)
50986112
>>> id(y)
50986112
사례 2
>>> x = "12"
>>> y = "123"
>>> x = x + "3"
>>> x is y
False
>>> x == y
True
ID가 경우 1에서 동일 및 사례 2에서하지 왜 지금, 당신의 질문은
경우 1에서, 리터럴 문자열 할당 "123"
에 x
와 y
.
문자열은 불변이기 때문에 인터프리터가 문자열 리터럴을 한 번만 저장하고 모든 변수를 동일한 객체를 가리키는 것이 좋습니다.
따라서 이드가 동일하다고 생각합니다.
In case 2, you are modifying x
using concatenation. Both x
and y
has same values, but not same identity.
Both points to different objects in memory. Hence they have different id
and is
operator returned False
참고URL : https://stackoverflow.com/questions/15541404/python-string-interning
'IT TIP' 카테고리의 다른 글
Python 다중 처리를 사용하여 난처한 병렬 문제 해결 (0) | 2020.10.12 |
---|---|
CoffeeScript의 함수 선언 (0) | 2020.10.12 |
R에서 Excel로 쓸 때 java.lang.OutOfMemoryError 처리 (0) | 2020.10.12 |
Android가 더 많은 열거 형을 사용하지 않는 이유는 무엇입니까? (0) | 2020.10.12 |
NodeJS / express : 캐시 및 304 상태 코드 (0) | 2020.10.12 |