[python] 파이썬 문자열 인턴

이 질문은 실제로 실제로 사용되지는 않지만 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"xy.

문자열은 불변이므로 인터프리터가 문자열 리터럴을 한 번만 저장하고 모든 변수를 동일한 객체를 가리키는 것이 좋습니다.
따라서 이드가 동일하다고 생각합니다.

경우 2에서는 x연결을 사용하여 수정 하고 있습니다. x및 둘 다 y동일한 값을 갖지만 동일하지 않습니다.
둘 다 메모리의 다른 개체를 가리 킵니다. 따라서 서로 다른이 idis운영자는 반환False


답변