2016-11-19 66 views
-1

這裏是我的代碼部分:這裏是什麼python list索引解釋?

some_item = target_item 
first_item = my_list[0] 
print first_item 
print some_item 
print my_list.index(first_item) 
print my_list.index(some_item) 
print "Finished" 
exit() 

這裏是我所得到的:

<models.adb.ADB object at 0x7f1ec7654b50> 
<models.seb.SEB object at 0x7f1ec7654b90> 
0 
0 
Finished 

我在my_list項目類對象。

有人可以解釋這種行爲嗎?

+2

'first_item == some_item'的結果是什麼? –

+0

你能告訴我們你是如何將它們添加到列表中的嗎? –

+1

,你期望什麼行爲?有什麼需要解釋的?是不是假設'first_item'不等於'some_item'(因爲print的結果是不同的),因此'.index'返回相同的數字這一事實讓我感到驚訝? –

回答

1

這取決於對ADBSEB執行的比較,可能是通過對此類實施__eq__運算符。

當Python會尋找的first_itemsome_item名單上的情況下,他會用該運營商以確定是否在名單上的i個元素是這個元素,席捲了每一個i

因此,如果實現是像

class Parent: 
    def __init__(self): 
     self.x = 0 
    def __eq__(parentObj): 
     return self.x == parentObj.x 

class ADB (Parent): 
    def __init__(self): super.__init__() 

class SEB (Parent): 
    def __init__(self): super.__init__() 

這將導致ADB() == SEB(),因此,造成的對象都「匹配」的第一個列表的元素進行比較,以它的時候,卻是在不同的對象同時。


請注意,同樣可以這樣做,爲了簡化示例,使用了繼承。

class ADB (Parent): 
    def __init__(self): 
     self.x = 0 
    def __eq__(obj): 
     return self.x == obj.x 

class SEB (Parent): 
    def __init__(self): 
     self.x = 0 
    def __eq__(obj): 
     return self.x == obj.x 
+0

我認爲你是對的,是在我的__eq__他們是平等的,但我認爲Python匹配這些對象的地址,而不是調用__eq__ –

+0

其實主要問題是當我試圖調用my_list.remove(some_item)它似乎是它不會刪除,但是當我連續調用my_list.remove(some_item)兩次時,它會將其刪除,奇怪的是當我連續第三次調用它時,它不會拋出異常! –