2010-06-15 91 views
6

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

這告訴我,Python是大概檢查對象引用,這是有道理的。有什麼更明確的,我可以看看?

回答

4

(An Unofficial) Python Reference Wiki:當且僅當存在一個索引i,使得x == y[i]是真的

對於列表和元組類型,x in y是真實的。

所以,在你的榜樣,如果fancy_obj類存儲的arg值在一個實例變量,併爲實現如果被比較的兩個fancy_objs已經爲arg然後(1, fancy_obj(arg='C:\\'),) in haystack相同的值將是真實的,返回真一個__eq__方法。

標準庫參考的相關頁面是:Built-in Types,具體5.6 Sequence Types

3

Python是使用==操作者的(等效)。如果fancy_obj類沒有定義__eq__(或舊的__cmp__,仍支持向後兼容性),那麼等號==「退回」到標識is,這似乎是在這裏發生的事情。

相關的文檔是here,我引用:

x in s真,如果S的產品等於x,否則返回False

和「等於」是指==是真實的。

4

這裏是從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; 
} 

所以基本上使用==與對象和在列表中的每個對象。