2010-06-15 21 views
6

पाइथन (2.6.4, विशेष रूप से) सामान्य रूप से सूची सदस्यता कैसे निर्धारित करता है? मैं देखना यह क्या करता है कुछ परीक्षण किया है:सूची सदस्यता का विशिष्टता

def main(): 
    obj = fancy_obj(arg='C:\\') 
    needle = (50, obj) 
    haystack = [(50, fancy_obj(arg='C:\\')), (1, obj,), needle] 

    print (1, fancy_obj(arg='C:\\'),) in haystack 
    print needle in haystack 

if __name__ == '__main__': 
    main() 

कौन सा पैदावार:

False 
True 

यह मुझसे कहता है कि अजगर शायद वस्तु संदर्भ जाँच कर रहा है, जो समझ में आता है। क्या मैं कुछ और निश्चित हूं जो मैं देख सकता हूं?

उत्तर

4

(An Unofficial) Python Reference Wiki से: यदि और केवल यदि वहाँ एक सूचकांक मैं ऐसा है कि x == y[i] सच है मौजूद है

सूची और टपल प्रकारों के लिए, x in y सच है।

तो अपने उदाहरण में, एक __eq__ विधि है कि यह सच है लौटे अगर दो fancy_objs तुलना की जा रही arg तो (1, fancy_obj(arg='C:\\'),) in haystack के लिए एक ही मूल्य था यह सच हो सकता है लागू करने के लिए करता है, तो fancy_obj वर्ग एक उदाहरण चर में arg का मूल्य संग्रहीत और थे।

स्टैंडर्ड लाइब्रेरी संदर्भ के प्रासंगिक पृष्ठ है: Built-in Types, विशेष रूप से 5.6 Sequence Types

3

अजगर == ऑपरेटर (के बराबर) का उपयोग कर रहा है। यदि fancy_obj कक्षा __eq__ (या क्रॉफ्टी पुरानी __cmp__ परिभाषित नहीं करती है, फिर भी पिछली संगतता के लिए समर्थित है) तो समानता, ==, पहचान पर वापस "वापस आती है", is, और ऐसा लगता है कि यहां क्या हो रहा है। किसी और झूठी

और "बराबर करने के लिए"

x in s यह सच है, तो रों के एक आइटम एक्स के बराबर है, इसका मतलब है == सत्य है:

प्रासंगिक डॉक्स here हैं, और मैं बोली।

static int 
list_contains(PyListObject *a, PyObject *el) 
{ 
    Py_ssize_t i; 
    int cmp; 

    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i) 
     cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i), 
              Py_EQ); 
    return cmp; 
} 

तो मूल रूप से यह वस्तु और सूची में प्रत्येक वस्तु के साथ == उपयोग करता है:

4

यहाँ अजगर SVN से कोड है।

संबंधित मुद्दे