比较 Python 中对象的位表示
Comparing bit representation of objects in 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 中的东西吗? (我没写过代码Python2)
我已经尝试完成同样的事情,获取字符串的位表示并检查位的不同之处:
k1 = format(hash('Monty'),'b')
k2 = format(hash('Money'),'b')
diff = ('^ ' [a==b] for a,b in zip(k1,k2))
print(k1,'\n',k2,'\n',''.join(diff))
我确实得到了预期的结果:
已更新
必须将第一行移动 1 space 以匹配符号
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 中的 built-in 函数。
- 默认情况下
format()
不显示前导零。使用格式字符串 032b
将 32 个字符的字段中的数字格式化为前导零。
>>> format(hash('Monty'), '032b')
'1001000100011010010110101101101011000010101011100110001010001'
您 运行 遇到的另一个问题是 hash()
可以 return 负数。也许这不会发生在 Python 2 中,或者他的 bits()
函数显示数字的二进制补码位。您可以通过规范化输入来做到这一点:
def bits(n):
if n < 0:
n = 2**32 + n
return format(n, '032b')
- 每次 运行 代码,您都会定义新的
fn
和 nf
函数。不同的函数不一定具有相同的哈希码,即使它们具有相同的名称。
如果不重新定义函数,每次都应该得到相同的哈希码。
哈希字符串和数字只取决于内容,但哈希更复杂的对象取决于具体实例。
我正在观看名为 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 中的东西吗? (我没写过代码Python2)
我已经尝试完成同样的事情,获取字符串的位表示并检查位的不同之处:
k1 = format(hash('Monty'),'b')
k2 = format(hash('Money'),'b')
diff = ('^ ' [a==b] for a,b in zip(k1,k2))
print(k1,'\n',k2,'\n',''.join(diff))
我确实得到了预期的结果:
已更新 必须将第一行移动 1 space 以匹配符号
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 中的 built-in 函数。 - 默认情况下
format()
不显示前导零。使用格式字符串032b
将 32 个字符的字段中的数字格式化为前导零。
>>> format(hash('Monty'), '032b')
'1001000100011010010110101101101011000010101011100110001010001'
您 运行 遇到的另一个问题是 hash()
可以 return 负数。也许这不会发生在 Python 2 中,或者他的 bits()
函数显示数字的二进制补码位。您可以通过规范化输入来做到这一点:
def bits(n):
if n < 0:
n = 2**32 + n
return format(n, '032b')
- 每次 运行 代码,您都会定义新的
fn
和nf
函数。不同的函数不一定具有相同的哈希码,即使它们具有相同的名称。
如果不重新定义函数,每次都应该得到相同的哈希码。
哈希字符串和数字只取决于内容,但哈希更复杂的对象取决于具体实例。