我正在尝试理解我目前正在处理的一段代码(它的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 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的棋盘。 #F F F. #F F F. #F F F. #F F F
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。在我看来,_ hash _函数中的循环以某种方式与生成密钥相关联。
在这个阶段,我可以想象h是某种形式的关键。每次通过循环时,键本身的值似乎都会增加。
令我困惑的是桌子实际上是什么样的?
这是吗? # 1 - value
# 2 - value
# 3 - value
# 6 - value
# 7 - value
# 8 - value
等...
第3。任何人都可以向我指出一个资源,它可以让我了解哈希(h)在程序上的作用吗?
非常感谢您阅读此内容并希望提供帮助。
迈克答案 0 :(得分:2)
__hash__()
函数只返回一个整数。它是从内置函数hash()
调用的。
哈希函数的关键属性是,如果两个板是等效的,则在它们上调用__hash__
将给出相同的数字。如果电路板不同,那么它们的散列是不同的(但不是必需的)。
哈希函数最常用于哈希表,但哈希函数本身不会创建或使用哈希表。对hash(h)
的调用只是将h
从可能很大的数字转换为32位整数。
答案 1 :(得分:2)
- 看起来我们在这里基于self.data创建了某种哈希表,但似乎我们将这个哈希表留空了?我们为什么要这样做?
醇>
您显示的代码不会创建哈希表。相反,如果Grid对象用作哈希表中的键,则其__hash__
方法将用于为其生成哈希码。
- 在我看来,
醇>__hash__
函数中的循环以某种方式与生成密钥相关联。
事实上。它生成的密钥是对象的哈希码。
- 任何人都可以指向一个资源,让我了解哈希(h)在程序上的作用吗?
醇>
hash(h)
返回h
的哈希码。散列码是与对象关联的数字,对于相等对象保证相等,对于不同对象不太可能相等;它们用于在哈希表中查找对象。对于整数,hash(h)
通常是整数本身。