繁体   English   中英

Python中的__hash__函数

[英]__hash__ function in Python

我正在尝试了解我当前正在通过的一段代码(它的pacman)。

我在Python中具有以下2D数组:

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

变量initialValue默认为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分界符将Grid变成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 _函数时,我迷路了。

我曾经研究过哈希表和哈希表,但似乎无法找到函数hash()对变量h的作用?

让我感到困惑的是:

1.好像我们在这里基于self.data创建某种哈希表,但是好像我们将此哈希表留空了吗? 我们为什么要这样做?

2.在我看来,_ hash _函数内部的循环以某种方式链接到生成键。

在这个阶段,我可以想象h是某种形式的密钥。 每次通过循环时,密钥本身的值似乎都会增加。

令我困惑的是桌子的实际外观?

是这个吗

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

等等...

3.有人可以将我指向一种资源,该资源可以使我了解hash(h)对h的作用是什么?

非常感谢您阅读本文并希望提供帮助。

麦克风

__hash__()函数仅返回一个整数。 从内置函数hash()调用它。

哈希函数的关键特性是,如果两个板子相等, __hash__在它们上调用__hash__会得到相同的数字。 如果板子不同,则哈希值不同也很好(但不是必需)。

哈希表最常使用哈希函数,但是哈希函数本身不会创建或使用哈希表。 hash(h)的调用只是将h从可能很大的数字转换为32位整数。

  1. 好像我们在这里基于self.data创建某种哈希表,但是好像我们将此哈希表留空了吗? 我们为什么要这样做?

您显示的代码不会创建哈希表。 相反,如果将Grid对象用作哈希表中的键,则将使用其__hash__方法为其生成哈希码。

  1. 在我看来, __hash__函数内部的循环以某种方式链接到生成密钥。

确实。 它生成的密钥是对象的哈希码。

  1. 任何人都可以将我指向一种资源,该资源可以使我了解hash(h)对h的作用是什么?

hash(h)返回的哈希码h 哈希码是与对象关联的数字,对于相同的对象,该数字保证相等,而对于不同的对象,该数字不太可能相等。 它们用于在哈希表中定位对象。 对于整数, hash(h)通常是整数本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM