>  기사  >  백엔드 개발  >  문자열을 사용하는 Python의 \'is\' 연산자 뒤에 숨은 마법은 무엇입니까?

문자열을 사용하는 Python의 \'is\' 연산자 뒤에 숨은 마법은 무엇입니까?

DDD
DDD원래의
2024-10-21 17:46:03700검색

What's the Magic Behind Python's 'is' Operator with Strings?

Python의 문자열용 'is' 연산자 구현: 종합 안내서

Python에서 'is' 연산자는 일반적으로 문자열의 동등성을 테스트하는 데 사용됩니다. 그러나 그 구현은 '__eq__'와 같은 다른 항등 연산자보다 돋보입니다. 이 기사에서는 Python 내에서 'is'가 어떻게 작동하는지 복잡하게 살펴봅니다.

콘텐츠 평등을 확인하는 '__eq__'와 달리 'is'는 정체성을 평가합니다. 문자열을 처리할 때 이는 'is'가 두 문자열이 동일한 메모리 위치를 차지하는지 여부를 결정한다는 의미입니다.

사용자 정의 클래스에서 'is' 동작을 모방하려고 할 때 문제가 발생합니다. Python은 특정 구현을 기대하므로 '__is__' 메서드를 정의하는 것만으로는 충분하지 않습니다. Python의 기대에 부응하려면 문자열 인터닝의 특성을 이해하는 것이 중요합니다.

인터닝에는 문자열 개체를 중앙 캐시에 저장하여 동일한 문자열에 대한 여러 참조가 단일 공유 인스턴스를 가리키도록 보장하는 작업이 포함됩니다. 이러한 최적화는 메모리 소비를 줄이고 속도를 향상시켜 성능을 향상시킵니다.

Python에서는 'abc'와 같은 문자열 리터럴이 자동으로 인터닝됩니다. 따라서 (('abc' == 'abc') 및 ('abc' is 'abc'))는 True로 평가됩니다. 그러나 사용자 정의 문자열의 경우 인터닝을 명시적으로 수행해야 합니다.

다음 예에서는 인터닝된 문자열과 인터닝되지 않은 문자열을 사용하여 'is'와 '__eq__'의 차이점을 보여줍니다.

<code class="python">>>> s = 'str'
>>> s is 'str'
True
>>> class MyString:
...     def __init__(self):
...         self.s = 'string'
...     def __eq__(self, s):
...         return self.s == s
...
>>> m = MyString()
>>> m is 'string'
False
>>> sys.intern(m) is 'string'   # After interning, 'is' returns True
True</code>

To 요약하자면, 'is'는 메모리 위치를 비교하여 Python에서 객체 ID를 확인합니다. 문자열의 경우 이는 인턴이 상당한 역할을 한다는 것을 의미합니다. Interned 문자열은 동일한 메모리 주소를 공유하므로 'is'가 동등성을 올바르게 결정할 수 있습니다. 사용자 정의 클래스에서 'is'를 구현할 때 Python의 동작을 복제하려면 인턴이 적절하게 처리되도록 하는 것이 필수적입니다.

위 내용은 문자열을 사용하는 Python의 \'is\' 연산자 뒤에 숨은 마법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.