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
'developer tip' 카테고리의 다른 글
코드 서명 ID 란 무엇입니까? (0) | 2021.01.06 |
---|---|
C #에서 모든 컨트롤러 및 작업 이름 가져 오기 (0) | 2021.01.05 |
현재 선택한 항목을 다시 선택할 때 Android Spinner에서 이벤트를 받으려면 어떻게해야합니까? (0) | 2021.01.05 |
MySQL의 Case 문 (0) | 2021.01.05 |
PHP 용 AWS SDK : 인스턴스 프로필 메타 데이터 서버에서 자격 증명을 검색하는 동안 오류가 발생했습니다. (0) | 2021.01.05 |