2014-12-02 3 views

답변

14

이 질문에 대답하기 위해 우리는 파이썬 인터프리터가 어떻게 작동하는지에 대해 자세히 알아야합니다. 그것은 다른 파이썬 구현에서 다를 수 있습니다.

먼저 os.removeos.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 그렇게 eqtrue을 시작합니다. 그런 다음 ml_meth (위의 구조체에서 참조 된 동일한 posix_unlink)의 함수 포인터를 비교하고 eq이 일치하므로 true으로 유지됩니다. 결과적으로 파이썬은 True을 반환합니다.

is 연산자가 더 간단하고 엄격합니다. is 연산자는 PyCFunctionObj* 포인터 만 비교합니다. 그들은 다르다 - 다른 구조체에서 왔고 별개의 객체이므로 is 연산자는 False을 반환합니다.

이론적 근거는 별개의 함수 객체 (문서 구조가 다름)를 나타내지 만 동일한 구현을 가리키기 때문에 is== 사이의 동작 차이가 정당화 될 수 있습니다.

is은 더 강력한 보증을 제공하며 빠르고 (포인터 비교, 본질적으로) 의미가 있습니다. == 연산자는 객체를 검사하고 내용이 일치하면 True을 반환합니다. 이 문맥에서 함수 포인터는 내용입니다.