이 질문은 실제로 실제로 사용되지는 않지만 Python이 문자열 인턴을 수행하는 방법에 대해 궁금합니다. 나는 다음을 발견했다.
>>> "string" is "string"
True
이것은 내가 예상했던 것입니다.
이것을 할 수도 있습니다.
>>> "strin"+"g" is "string"
True
그리고 그것은 꽤 영리합니다!
그러나 당신은 이것을 할 수 없습니다.
>>> s1 = "strin"
>>> s2 = "string"
>>> s1+"g" is s2
False
왜 파이썬은 평가하지 것 s1+"g"
, 그것은과 동일 실현 s2
과 같은 주소를 가리? 마지막 블록에서 실제로 무슨 일이 일어나고 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
.
문자열은 불변이므로 인터프리터가 문자열 리터럴을 한 번만 저장하고 모든 변수를 동일한 객체를 가리키는 것이 좋습니다.
따라서 이드가 동일하다고 생각합니다.
경우 2에서는 x
연결을 사용하여 수정 하고 있습니다. x
및 둘 다 y
동일한 값을 갖지만 동일하지 않습니다.
둘 다 메모리의 다른 개체를 가리 킵니다. 따라서 서로 다른이 id
와 is
운영자는 반환False