![](/img/trans.png)
[英]python video b'\x1aE\xdf\xa3\x01\x00\x00\x00\x00\x00\x00\
[英]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')
为True
而bool(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.