IT TIP

파이썬 문자열 인턴

itqueen 2020. 10. 12. 21:19
반응형

파이썬 문자열 인턴


이 질문은 실제로 실제로 사용되지는 않지만 파이썬이 문자열 인턴을 어떻게 수행하는지 궁금합니다. 나는 다음을 알아 차렸다.

>> "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"xy.

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

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

반응형