2013-06-04 17 views
0

我希望有人對我遇到的這個問題有一個快速修復。 我希望能夠在迭代中計數用戶定義對象的出現次數。問題是,當我創建一個對象來比較對象時,它會在內存空間中創建另一個對象,以便該對象在應該出現時不會被計數。列表中的用戶定義對象的Python指針和內存空間

例子:

class Barn: 
    def __init__(self, i,j): 
     self.i = i 
     self.j = j 

barns = [Barn(1,2), Barn(3,4)] 
a = Barn(1,2) 
print 'number of Barn(1,2) is', barns.count(Barn(1,2)) 
print 'memory location of Barn(1,2) in list', barns[0] 
print 'memory location of Barn(1,2) stored in "a"', a 

回報:

number of Barn(1,2) is 0 
memory location of Barn(1,2) in list <__main__.Barn instance at 0x01FCDFA8> 
memory location of Barn(1,2) stored in "a" <__main__.Barn instance at 0x01FD0030> 

有沒有一種方法,使該實例列表工作count方法,而無需你把命名列表中的每個項目它在哪裏召喚這些指稱對象?

回答

3

您需要爲您的類定義一個__eq__方法,該方法定義了您希望相等的含義。

class Barn(object): 
    def __init__(self, i,j): 
     self.i = i 
     self.j = j 
    def __eq__(self, other): 
     return self.i == other.i and self.j == other.j 

查看the documentation瞭解更多信息。請注意,如果您希望對象是可散列的(即可用作字典鍵),則必須多做一點。

+0

謝謝@BrenBarn,這非常有幫助。順便說一下適當的姓。 – chase

+1

使它可哈希:'def __hash __(self):return hash((self.i,self.j))'它假定列表只包含'__eq__',列表只包含Barn對象。 – jfs

+0

如果一個Barn對象在其中包含可變數量的貓作爲屬性(整個程序中連續更改的貓的數量),該怎麼辦?這是否使穀倉變得可變,或者,因爲它仍然是同一個穀倉,是否可以被散列呢? – chase

相關問題