2010-06-15 6 views
6

Wie bestimmt Python (2.6.4, speziell) die Listenmitgliedschaft im Allgemeinen? Ich habe einige Tests durchführen, um zu sehen, was es tut:Besonderheiten der Listenmitgliedschaft

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() 

Welche ergibt:

False 
True 

Das sagt mir, dass Python wahrscheinlich die Objektreferenzen prüft, was Sinn macht. Gibt es etwas Definitiveres, das ich sehen kann?

Antwort

4

Von (An Unofficial) Python Reference Wiki:

Für die Liste und Tupel-Typen, x in y ist wahr, wenn und nur wenn es einen Index i, so dass x == y[i] wahr ist.

Also in Ihrem Beispiel, wenn die fancy_obj um den Wert des arg in einer Instanzvariablen gespeichert und waren ein __eq__ Verfahren zu implementieren, der True zurückgegeben, wenn die beiden fancy_objs für arg dann (1, fancy_obj(arg='C:\\'),) in haystack wahr wäre hatte den gleichen Wert verglichen werden.

Die entsprechende Seite der Standard Library Referenz: Built-in Types, speziell 5.6 Sequence Types

3

Python ist die (äquivalent) der == Operator. Wenn die fancy_obj Klasse nicht __eq__ (oder die grausige alte __cmp__, immer noch für die Abwärtskompatibilität unterstützt), dann Gleichheit, ==, "fällt zurück" auf Identität, is, und das scheint zu sein, was hier passiert.

Die entsprechenden Dokumente sind here, ich zitiere:

x in s Wahr, wenn ein Element von s gleich x ist, sonst Falsch

und „gleich“ bedeutet == wahr ist.

4

Hier ist Code aus dem Python SVN:

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; 
} 

so dass im Grunde verwendet es die == mit dem Objekt und jedes Objekt in der Liste.

Verwandte Themen