运行 python3 -bb 时,为什么 set([b'foo', u'foo']) 失败而 set([b'foo', u'bar']) 成功?

问题描述 投票:0回答:1

我试图通过添加

str(bytes)
参数来使一些代码
-bb
在 Python 3 上安全,这会将
str(bytes)
和 bytes/str 比较都变成错误。

发出有关 str(bytes_instance)、str(bytearray_instance) 和 将 bytes/bytearray 与 str 进行比较。 (-bb:问题错误)

该程序失败了,因为一个库试图构建一个包含

str
bytes
的集合,但它不能交互式地重现:
set([b'foo', u'bar'])
有效。为什么只有
set([b'foo', u'foo'])
会失败?

python python-3.x set
1个回答
0
投票

通过实验:

  • set(['foo', b'foo'])
    返回包含两个对象的集合
  • 'foo'
    b'foo'
    哈希为相等的值
  • 因此 Python 必须比较它们是否相等(否则该集合将只有一个成员),因此在
    -bb
  • 下会引发错误
>>> set(['foo', b'foo'])
{b'foo', 'foo'}
>>> hash('foo')
7554140378331821102
>>> hash(b'foo')
7554140378331821102
>>> hash('foo') == hash(b'foo')
True
>>> 'foo' == b'foo'
False
© www.soinside.com 2019 - 2024. All rights reserved.