Python数组[0:1]与数组[0]不同

Fra*_*cis -1 python indexing bytestring python-3.x

我正在使用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'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 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'
Run Code Online (Sandbox Code Playgroud)

真正做的不是用flags[0],bytes(flags[0])而是你使用了.将单个整数传递给该bytes()类型会创建一个bytes指定长度的新对象,预先填充\x00字节:

>>> flags[0]
1
>>> bytes(1)
b'\x00'
Run Code Online (Sandbox Code Playgroud)

因为flags[0]产生整数1,你告诉你bytes()返回一个长度为1的新字节值,用\x00字节填充.

bytes文档:

字节对象是单个字节的不可变序列.

[...]

虽然字节文字和表示基于ASCII文本,但字节对象实际上表现为不可变的整数序列,序列中的每个值都受到限制0 <= x < 256.

[...]

除了文字形式之外,还可以通过许多其他方式创建字节对象:

  • 指定长度的零填充字节对象: bytes(10)

大胆强调我的.

如果要创建一个bytes包含该字节的新对象,则需要先将整数值放入列表中:

>>> bytes([flags[0]])
b'\x01'
Run Code Online (Sandbox Code Playgroud)