如何解决比较Python中对象的位表示形式
我正在观看名为The Mighty Dictionary的视频,其中包含以下代码:
k1 = bits(hash('Monty'))
k2 = bits(hash('Money'))
diff = ('^' [a==b] for a,b in zip(k1,k2))
print(k1,k2,''.join(diff))
据我了解,bits
不是Python中的内置方法,而是他自己的书面方法,类似于`format(x,'b'),或者它在Python 2中是否存在? (我从未用Python 2编写过代码)
我尝试完成相同的操作,获取字符串的位表示形式,并检查位的不同之处:
k1 = format(hash('Monty'),'b')
k2 = format(hash('Money'),'b')
diff = ('^ ' [a==b] for a,'\n',''.join(diff))
我确实得到了预期的结果:
已更新 必须将第一行移动1个空格以匹配符号
110111010100001110100101100000100110111111110001001101111000110
-1000001111101001011101001010101101000111001011011000011110100
^ ^^^ ^ ^^ ^^^ ^^^^^^^ ^ ^^^^^ ^^ ^^ ^^^^^^^ ^ ^ ^^^
此外,位的长度也不相同,但是我知道无论字符串如何,在我的情况下,它都将采用相同的64位?但是它是63和62。
print(len(format(hash('Monty'),'b')))
print(len(format(hash('Money'),'b')))
63
62
所以,总结一下我的问题:
-
bits
是Python2中的内置方法吗? - 建议使用以下方法比较对象的位表示形式:
def fn():
pass
print(format(hash(fn),'b'))
# -111111111111111111111111111111111101111000110001011100000000101
- 取决于处理器,不是所有对象都具有相同长度的位来表示对象吗?如果多次运行以下代码,将会得到以下结果:
def fn():
pass
def nf():
pass
print(format(hash(fn),'b'))
print(format(hash(nf),'b'))
# first time
# 10001001010011010111110000100
# -111111111111111111111111111111111101110110101100101000001000001
# second time
# 10001001010011010111111101010
# 10001001010011010111110000100
# third time
# 10001001010011010111101010001
# -111111111111111111111111111111111101110110101100101000001000001
解决方法
- 否,
bits
不是Python 2或Python 3中的内置函数。 - 默认情况下,
format()
不显示前导零。使用格式字符串032b
可以在32个字符的字段中使用前导零来格式化数字。
>>> format(hash('Monty'),'032b')
'1001000100011010010110101101101011000010101011100110001010001'
您遇到的另一个问题是hash()
可以返回负数。也许这在Python 2中无法实现,或者他的bits()
函数显示了数字的二进制补码。您可以通过规范化输入来实现:
def bits(n):
if n < 0:
n = 2**32 + n
return format(n,'032b')
- 每次运行代码时,都要定义新的
fn
和nf
函数。不同的函数即使名称相同,也不一定具有相同的哈希码。
如果不重新定义函数,则每次都应获得相同的哈希码。
哈希字符串和数字仅取决于内容,而哈希更复杂的对象则取决于特定实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。