我正在查看第三方API,他们有以下代码:
def array_u16 (n): return array('H', '\0\0'*n)
我理解'\0'
表示NULL
,'\0\0'
是否具有任何特殊含义,或仅表示2 NULL
s?
答案 0 :(得分:10)
array
类接受格式化字符(称为typecode),后跟初始化程序。 H
表示无符号短整数,最小大小为2个字节,因此'\0\0'
满足此要求。 * n
部分是将整个数组初始化为NULL字节。
答案 1 :(得分:7)
它只确保提供两个字节n
次,因此数组的大小将等于n
。如果提供了'\0'
,则生成的数组将具有size == n//2
(due 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
字节最小4
但64bit
>>> 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个字。