머리말
두 연산자 is와 ==의 차이점에 대해 이야기하기 전에 먼저 Python의 객체에 포함된 세 가지 기본 요소, 즉 id(ID), python type()(데이터 유형) 및 value( value)를 알아야 합니다. ). is와 ==는 둘 다 객체를 비교하고 판단하는 데 사용되지만 객체 비교와 판단의 내용은 다릅니다. 구체적인 차이점을 살펴보겠습니다.
Python에는 두 개체가 동일한지 비교하는 두 가지 방법이 있습니다. 간단히 말해서 차이점은 다음과 같습니다.
은 두 참조가 동일한 객체를 가리키는지 비교하는 것입니다(참조 비교).
==는 두 객체가 같은지 비교하는 것입니다.
>>> a = [1, 2, 3] >>> b = a >>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象 True >>> b == a # 当然,他们的值也是相等的 True >>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象, >>> b is a # 所以指向的不是同一个对象了 False >>> b == a # 但他们的值还是相等的 True
실행원리
은 둘이 동일한 객체인지 비교하므로 비교되는 것은 메모리 주소(id가 동일한지 여부)입니다.
==는 값 비교입니다. int, str과 같은 불변 객체는 값을 직접 비교합니다. Python에 알려진 객체의 경우 해당 __eq__ 함수가 비교를 위해 호출됩니다. (실제로 알려진 객체도 내장된 __eq__ 함수를 통해 비교해야 합니다.) 사용자 정의 객체의 경우 __eq__ 함수가 구현되어 있으면 비교됩니다. 구현되지 않으면 ==와 효과는 동일합니다.
객체 캐싱 메커니즘
Python은 다음에 비교적 작은 개체를 사용할 때 캐시 영역에서 검색합니다. 해당 개체가 발견되면 새 메모리를 열지 않고 계속해서 개체의 주소를 할당합니다. 작은 개체를 새 개체로 변환합니다. 예:
>>> c = 1 >>> d = 1 >>> print(c is d) True >>> 1000 is 10**3 False >>> 1000 == 10**3 True
계산된 할당은 버퍼 영역을 사용하지 않습니다. 이는 첫 번째 코드 예제에서 볼 수 있습니다.
문자열의 경우 intern 함수를 사용하여 버퍼를 강제로 사용할 수 있습니다.
요약
이상은 이 글의 전체 내용입니다. 모든 분들의 공부나 업무에 조금이나마 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시면 메시지를 남겨주세요.