Bu soruyu cevaplamak için, python yorumlayıcısının nasıl çalıştığıyla ilgili ayrıntılara biraz dalmak zorundayız. Diğer python uygulamalarında farklı olabilir.
Önce os.remove
ve os.unlink
işlevlerinin tanımlandığı yerlerden başlayalım. Modules/posixmodule.c yılında kayıtlı oldukları gibidir:
{"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
{"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
Not o işlev işaretçileri onların ml_meth
üyesi posix_unlink
hem nokta.
Yöntem nesneleri için ==
eşitlik işleci, Objects/methodobject.c numaralı telefondan meth_richcompare(...)
tarafından uygulanır.
Bu mantık, ==
operatörünün neden True
döndürdüğünü açıklar. yerleşik işlevleri m_self
için
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
yüzden eq
true
başlar olduğunu. Ardından, ml_meth
(yukarıdaki posix_unlink
referansından aynıdır) işlev işaretleyicilerini karşılaştırırız ve eq
eşleştikleri için true
kalır. Sonuç olarak, python True
döndürür.
is
işleci daha basit ve daha katıdır. is
operatörü yalnızca PyCFunctionObj*
işaretçisini karşılaştırır. Farklı olacaklar - farklı yapılardan geldiler ve farklı nesneler oldukları için is
operatörü False
'u döndürecek.
mantığı bunlar ayrı fonksiyonlar nesneleri (kendi Docstringler farklıdır hatırlamak) olması muhtemeldir ancak aynı uygulamaya işaret, böylece is
ve ==
arasındaki davranış farkı haklı olduğunu.
is
, daha güçlü bir garanti getirir ve hızlı ve ucuz olması (aslında bir işaretçi karşılaştırması) anlamına gelir. ==
işleci, nesneyi inceler ve içeriği eşleştiğinde True
değerini döndürür. Bu bağlamda, fonksiyon gösterici içeriktir.