2014-02-16 25 views
1

我想了解我目前正在使用的一段代碼(它的pacman)。Python中的__hash__函數

我在Python以下2D陣列:

self.data = [[initialValue for y in range(height)] for x in range(width)] 

變量初值是默認爲F.因此陣列是(含有值「F」爲列表中的每個元素列表的列表等左右):

# F F F F 
    # F F F F 
    # F F F F 

現在我的代碼執行以下操作 - 我明白這部分,但認爲把它列入情況下,它事項我的問題:

def __getitem__(self, i): 
     return self.data[i] 

def __setitem__(self, key, item): 
     self.data[key] = item 

def __str__(self):   
     out = [[str(self.data[x][y])[0] for x in range(self.width)] for y in range(self.height)] 
     out.reverse()         #reverses the oder of with the last row of the two dimensional array becoming the first row. 
     return '\n'.join([''.join(x) for x in out])  #every line is appended with a space '' followed by a line-break with '\n' 

後者使用\ n分界符將網格變成F的棋盤。 #FFF #FFF #FFF #FFF

def __eq__(self, other):        # The __eq__ method compares other instances of the class with itself 
     if other == None: return False 
     return self.data == other.data 

def __hash__(self): 
     # return hash(str(self)) 
     base = 1 
     h = 0 
     for l in self.data: 
      for i in l: 
       if i: 
        h += base 
       base *= 2 
     return hash(h) 

我碰巧知道大部分,*但是當涉及到_ 哈希 _功能。*

我迷路

我做過研究散列表和散列表,但我似乎無法找到函數hash()對我們的變量h做什麼?

什麼讓我困惑的是以下幾點:

1.好像我們正在創造某種哈希表的此基於self.data,但似乎我們離開這個哈希表是空的?我們爲什麼要這樣做?

2.在我看來,像_ 哈希 _功能以某種方式連接到生成密鑰內循環。

在這個階段,我可以想象,h是某種形式的關鍵。每次通過循環時,密鑰本身的值似乎都會增加。

讓我困惑的是表格實際上是什麼樣子?

這是嗎?

# 1 - value 
    # 2 - value 
    # 3 - value 
    # 6 - value 
    # 7 - value 
    # 8 - value 

等等

3.任何人可以點我的資源,將提供給我什麼散列(H)的想法確實到h程序上?

非常感謝您閱讀本文並希望爲您提供幫助。

邁克

+0

['__hash__'](http://docs.python.org/2/reference/datamodel.html#object.__hash__) – thefourtheye

+0

謝謝thefourtheye - 但我試圖理解python文檔,它沒有屈服我期待的清晰度。解釋hash()函數在程序上做什麼的任何其他資源?在cPython中, – Z101

+0

,整數的散列本身就是這樣,所以'return hash(h)'就等於'return h' ...... – roippi

回答

2

__hash__()函數會返回一個整數。它由內置函數hash()調用。

哈希函數的關鍵屬性是,如果兩個主板相同,那麼調用__hash__就會給出相同的數字。如果電路板不同,它們的散列是不同的,這是好的(但不是必需的)。

散列表最常用的是散列函數,但散列函數本身不會創建或使用散列表。撥打hash(h)只需將h從可能很大的數字轉換爲32位整數。

+0

我明白了。那麼我們在這裏做的是告訴我們的類通過上面的循環生成這個整數的方法? for l in self.data: for i in l: if i: h + = base base * = 2 – Z101

+0

@MNeelko是的:) – tom

+0

非常感謝Tom! – Z101

2
  1. 好像我們正在創造某種哈希表的此基於self.data,但似乎我們離開這個哈希表是空的?我們爲什麼要這樣做?

您顯示的代碼不會創建散列表。相反,如果一個Grid對象被用作散列表中的一個鍵,它的__hash__方法將被用來爲它生成一個散列碼。

  1. 在我看來,像__hash__函數內部循環以某種方式連接到生成密鑰。

確實。它生成的密鑰是對象的哈希碼。

  1. 任何人都可以點我的資源,將提供給我什麼散列(H)的想法確實到h程序上?

hash(h)返回h的哈希碼。哈希代碼是與對象相關的數字,對於相同的對象保證是相等的,並且對於不同的對象不可能是相等的;它們用於在哈希表中查找對象。對於整數,hash(h)通常是整數本身。

+0

謝謝user2357112。這也是非常有幫助的! – Z101