我正在使用Python来分割2个字节b'\x01\x00'
的字符串。字节串存储在名为flags
的变量中。
为什么当我说flags[0]
时我会b'\x00'
,但当我说flags[0:1]
时,我会得到b'\x01'
的预期答案。
这两种操作是否应该完全相同?
我做了什么:
>>> flags = b'\x01\x00'
>>> flags[0:1]
b'\x01'
>>> bytes(flags[0])
b'\x00'
答案 0 :(得分:5)
在Python 3中,bytes
是一个包含整数的序列类型(每个都在0 - 255范围内),因此索引到特定索引会得到一个整数。
就像切片列表为切片生成一个新的列表对象一样,切片bytes
对象也会生成一个新的bytes
实例。并且bytes
实例的表示尝试向您显示b'...'
字面语法,其中整数表示为可打印的ASCII字符或当字节不可打印时适用的转义序列。所有这些都非常适合开发,但可能隐藏字节实际上是整数序列的事实。
但是,您仍会获得相同的信息; flags[0:1]
是一个长度为bytes
的单字节值,其中包含\x01
字节,flags[0]
将为您提供整数1
:
>>> flags = b'\x01\x00'
>>> flags[0]
1
>>> flags[0:1]
b'\x01'
真正所做的不是flags[0]
,而是使用了bytes(flags[0])
。将单个整数传递给bytes()
类型会创建一个指定长度的新bytes
对象,预先填充\x00
个字节:
>>> flags[0]
1
>>> bytes(1)
b'\x00'
由于flags[0]
生成整数1,您告诉bytes()
返回长度为1的新字节值,填充\x00
个字节。
字节对象是单字节的不可变序列。
[...]
虽然字节文字和表示基于ASCII文本,但字节对象实际上表现为不可变的整数序列,序列中的每个值都被限制为
0 <= x < 256
。[...]
除了文字形式之外,还可以通过多种其他方式创建字节对象:
- 指定长度的零填充字节对象:
bytes(10)
大胆强调我的。
如果要创建一个包含该字节的新bytes
对象,则需要先将整数值放入列表中:
>>> bytes([flags[0]])
b'\x01'
答案 1 :(得分:-1)
是的,你应该得到同样的东西。在这两种情况下b'\x01'
。 flags
可能不是您认为的那样。
>>> flags = b'\x01\x00'
>>> flags[0]
'\x01'
>>> flags[0:1]
'\x01'