繁体   English   中英

为什么内置函数`any(b'\ x00')`在python2和python3之间表现不同?

[英]Why is the builtin function `any(b'\x00')` behaving differently between python2 and python3?

以下示例在Python 2.x中返回True ,而在Python 3.x中返回False

 python -c "print(any(b'\x00'))"

我找不到任何解释。 bool(b'\\x00')在Python 2.x和Python 3.x中都返回True 我期望值为true,因为字节序列包含一个评估为True的元素。

我错过了哪一部分语言规范/文档?

在Python 2.x上,当迭代字节字符串(如b'\\x00\\x00\\x00' ,迭代器将其组件作为子字符串产生:

>>> list(iter(b'\x00\x00\x00'))
['\x00', '\x00', '\x00']
>>> list(b'\x00\x00\x00')
['\x00', '\x00', '\x00']

这是因为字节字符串只是Python 2中的字符串,因此显示相同的行为。

OTOH,如果我们使用python 3,字节字符串将其内容作为int s产生:

>>> list(iter(b'\x00\x00\x00'))
[0, 0, 0]
>>> list(b'\x00\x00\x00')
[0, 0, 0]

从这个差异来看,其他一切都很清楚:正如我们已经注意到的那样, bool(b'\\x00')Truebool(0)False

迭代一个元素字符串时也是如此: list(b'\\x00')在Py2中给出['\\x00'] ,在Py3中给出[0][bool(i) for i in b'\\x00']给出[bool(i) for i in b'\\x00'] Py2中的[True]与Py3中的[False]相比,因此存在差异。

注意

any([bool(i) for i in b'\x00'])
any([i for i in b'\x00'])
any(b'\x00')

在语义上是相同的:迭代给定的对象,获取每个项目的真值,并返回任何一个是True

TLDR: b'\\x00'[0] == b'\\x00'在Python 2中, 0在Python 3中。

在Python2中,b'\\ x00'是str类型。 在Python3中,b'\\ x00'是\\ type bytes

在Python3中

虽然字节文字和表示基于ASCII文本,但字节对象实际上表现为不可变的整数序列,[...]

https://docs.python.org/3/library/stdtypes.html#binaryseq

因此,在Python3中,您的字节字符串由整数0组成,即False 在Python2中,它由str “字符”组成,它是非空的,因此是True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM