[英]__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位整数。
- 好像我们在这里基于self.data创建某种哈希表,但是好像我们将此哈希表留空了吗? 我们为什么要这样做?
您显示的代码不会创建哈希表。 相反,如果将Grid对象用作哈希表中的键,则将使用其__hash__
方法为其生成哈希码。
- 在我看来,
__hash__
函数内部的循环以某种方式链接到生成密钥。
确实。 它生成的密钥是对象的哈希码。
- 任何人都可以将我指向一种资源,该资源可以使我了解hash(h)对h的作用是什么?
hash(h)
返回的哈希码h
。 哈希码是与对象关联的数字,对于相同的对象,该数字保证相等,而对于不同的对象,该数字不太可能相等。 它们用于在哈希表中定位对象。 对于整数, hash(h)
通常是整数本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.