2014-12-02 10 views

cevap

14

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 eqtrue 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.

İlgili konular