developer tip

Python : ( "hello"는 "hello")가 True로 평가되는 이유는 무엇입니까?

optionbox 2021. 1. 5. 07:59
반응형

Python : ( "hello"는 "hello")가 True로 평가되는 이유는 무엇입니까?


이 질문에 이미 답변이 있습니다.

파이썬으로 "hello" is "hello"생산 True합니까?

여기 에서 다음을 읽었습니다 .

두 문자열 리터럴이 같으면 동일한 메모리 위치에 배치됩니다. 문자열은 변경 불가능한 엔티티입니다. 해를 끼칠 수 없습니다.

그래서 모든 파이썬 문자열에 대해 메모리에 단 하나의 장소가 있습니까? 꽤 이상하게 들립니다. 여기서 무슨 일이 일어나고 있습니까?


Python (예 : Java, C, C ++, .NET)은 문자열 풀링 / 인턴을 사용합니다. 인터프리터는 "hello"가 "hello"와 동일하다는 것을 알고 있으므로 메모리에서 동일한 위치를 최적화하고 사용합니다.

또 다른 좋은 점 : "hell" + "o" is "hello"==>True


그래서 모든 파이썬 문자열에 대해 메모리에 단 하나의 장소가 있습니까?

아니요, 인터프리터가 최적화하기로 결정한 것은 언어 사양의 일부가 아니며 다른 CPython 버전에서 변경 될 수있는 정책에 기반한 결정입니다.

예. 내 설치 (2.6.2 Linux) :

>>> 'X'*10 is 'X'*10
True
>>> 'X'*30 is 'X'*30
False

int도 비슷합니다.

>>> 2**8 is 2**8
True
>>> 2**9 is 2**9
False

따라서 '문자열'은 '문자열'에 의존하지 마십시오. C 구현 만 봐도 안전하지 않습니다.


리터럴 문자열은 아마도 해시 또는 유사한 것을 기반으로 그룹화됩니다. 동일한 리터럴 문자열 중 두 개가 동일한 메모리에 저장되며 모든 참조는 모두이를 참조합니다.

 Memory        Code
-------
|          myLine = "hello"
|        /
|hello  <
|        \
|          myLine = "hello"
-------

is두 인수가 같은 객체 경우는 true. 결과는 이것과 인용 된 비트의 결과입니다.

문자열 리터럴의 경우 이들은 인턴되어 알려진 문자열과 비교됩니다. 동일한 문자열이 이미 알려진 경우 리터럴은 대체 값 대신 해당 값을 사용합니다. 따라서 그들은 같은 대상이되고 그 표현은 사실입니다.


파이썬 인터프리터 / 컴파일러는 문자열 리터럴, 즉 인용 된 문자 목록을 구문 분석합니다. 이렇게하면 "I 've seen this string before"를 감지하고 지난번과 동일한 표현을 사용할 수 있습니다. 이렇게 정의 된 문자열은 변경할 수 없음을 알고 있으므로이를 수행 할 수 있습니다.


왜 이상 해요. 문자열이 불변이면 한 번만 저장하는 것이 좋습니다. .NET은 동일한 동작을합니다.


두 변수 (문자열뿐 아니라)가 동일한 값을 포함하면 값은 두 번이 아닌 한 번만 저장되고 두 변수가 동일한 위치를 가리킬 것이라고 생각합니다. 이것은 메모리를 절약합니다.

참조 URL : https://stackoverflow.com/questions/1392433/python-why-does-hello-is-hello-evaluate-as-true

반응형