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

时间:2016-09-13 13:28:46

标签: python python-3.x indexing bytestring

我正在使用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'

2 个答案:

答案 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个字节。

来自bytes documentation

  

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

     

[...]

     

虽然字节文字和表示基于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'