이 질문에 대답하기 위해 우리는 파이썬 인터프리터가 어떻게 작동하는지에 대해 자세히 알아야합니다. 그것은 다른 파이썬 구현에서 다를 수 있습니다.
먼저 os.remove
및 os.unlink
함수가 정의 된 곳부터 시작해 보겠습니다. Modules/posixmodule.c 그들은 등록 등 :
{"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
{"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
참고 그 함수 포인터 자신의 ml_meth
멤버 posix_unlink
을 모두 가리 킵니다.
메서드 개체의 경우 ==
항등 연산자는 meth_richcompare(...)
에 Objects/methodobject.c으로 구현됩니다.
여기에는이 논리가 포함되어있어 ==
연산자가 True
을 반환하는 이유를 설명합니다. 내장 함수 m_self
를 들어
a = (PyCFunctionObject *)self;
b = (PyCFunctionObject *)other;
eq = a->m_self == b->m_self;
if (eq)
eq = a->m_ml->ml_meth == b->m_ml->ml_meth;
는 NULL
그렇게 eq
이 true
을 시작합니다. 그런 다음 ml_meth
(위의 구조체에서 참조 된 동일한 posix_unlink
)의 함수 포인터를 비교하고 eq
이 일치하므로 true
으로 유지됩니다. 결과적으로 파이썬은 True
을 반환합니다.
is
연산자가 더 간단하고 엄격합니다. is
연산자는 PyCFunctionObj*
포인터 만 비교합니다. 그들은 다르다 - 다른 구조체에서 왔고 별개의 객체이므로 is
연산자는 False
을 반환합니다.
이론적 근거는 별개의 함수 객체 (문서 구조가 다름)를 나타내지 만 동일한 구현을 가리키기 때문에 is
과 ==
사이의 동작 차이가 정당화 될 수 있습니다.
is
은 더 강력한 보증을 제공하며 빠르고 (포인터 비교, 본질적으로) 의미가 있습니다. ==
연산자는 객체를 검사하고 내용이 일치하면 True
을 반환합니다. 이 문맥에서 함수 포인터는 내용입니다.