Python中'\ 0 \ 0'的含义?

时间:2016-11-07 18:42:44

标签: python string python-2.7 python-3.x

我正在查看第三方API,他们有以下代码:

def array_u16 (n): return array('H', '\0\0'*n)

我理解'\0'表示NULL'\0\0'是否具有任何特殊含义,或仅表示2 NULL s?

3 个答案:

答案 0 :(得分:10)

array类接受格式化字​​符(称为typecode),后跟初始化程序。 H表示无符号短整数,最小大小为2个字节,因此'\0\0'满足此要求。 * n部分是将整个数组初始化为NULL字节。

答案 1 :(得分:7)

它只确保提供两个字节n次,因此数组的大小将等于n。如果提供了'\0',则生成的数组将具有size == n//2due to the type-code 'H' requiring 2 bytes);这显然是反直觉的:

>>> array('H', '\0' * 10)    # 5 elements
array('H', [0, 0, 0, 0, 0])
>>> array('H', '\0\0' * 10)  # 10 elements
array('H', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

请注意,在Python 3中,如果您需要相同的代码段,必须 provide a bytes object作为initializer array的参数:

>>> array('H', b'\0\0' * 10)   
array('H', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

因为你也无法在Python 2中提供u''字符串。除此之外,行为保持完全相同。

所以'\0\0'是出于方便的原因,仅此而已。没有语法附加到'\0\0'

没有任何语义真正附加到'\0'(例如,C),'\0' 只是Python中的另一个字符串

作为此行为的另一个示例,对于无符号整数,使用类型代码'I'初始化数组,其中2字节最小464bit >>> array('I', b'\0\0\0\0' * 10) array('I', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) 1}} Python的构建。

根据您提供的代码段的精神,您可以通过执行以下操作来初始化阵列:

b'\0'

是的,10字符串的四倍,以获得'\0\0\' * n元素。

作为 final 注意事项 - 以下时序是在Python 3上执行的,但是2是相同的 - 您可能想知道为什么他使用[0] * n而不是更直观的n = 10000 %timeit array('I', [0]*n) 1000 loops, best of 3: 212 µs per loop %timeit array('I', b'\0\0\0\0'* n) 100000 loops, best of 3: 6.36 µs per loop 来初始化数组。嗯,它的速度要快得多:

'b'

当然,通过向bytearray提供array,您可以做得更好(对于%timeit array('I', bytearray(n)) 1000000 loops, best of 3: 1.72 µs per loop 以外的类型代码)。使用空字节初始化a bytearray is by providing an int as the number of items to initialize的一种方法:

bytearray(int)

但是,如果我没记错的话,初始化bytearray的3.7+方法可能会在{{1}}中弃用: - )。

答案 2 :(得分:6)

看起来这个函数返回一个由16位组成的数组;因此\0\0可能代表创建两个字节(16位)的数据。换句话说,它返回两个字节的n个字。