我期待在一個第三方API,他們有下面的一段代碼:Python中' 0 0'的含義?
def array_u16 (n): return array('H', '\0\0'*n)
我明白'\0'
意味着NULL
,確實'\0\0'
有什麼特殊的含義或者它僅僅意味着2個NULL
S'
我期待在一個第三方API,他們有下面的一段代碼:Python中' 0 0'的含義?
def array_u16 (n): return array('H', '\0\0'*n)
我明白'\0'
意味着NULL
,確實'\0\0'
有什麼特殊的含義或者它僅僅意味着2個NULL
S'
它看起來像這個函數返回一個由16位構成的數組;因此\0\0
可能代表創建兩個字節(即16位)的數據。換句話說,它返回兩個字節的n個字。
array
類接受一個格式字符(稱爲typecode),後跟一個初始值設定項。 H
表示一個無符號的短符號,最小大小爲2個字節,所以'\0\0'
就滿足了。 * n
部分是將整個數組初始化爲NULL字節。
它只是確保提供兩個字節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
構建的Python。
在您所提供的代碼段的精神,你會做這樣的事情初始化數組:
>>> array('I', b'\0\0\0\0' * 10)
array('I', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
是,四次b'\0'
串獲得10
元素。
作爲最後注 - 以下時序上的Python 3進行,但2是相同 - 你可能會奇怪,爲什麼他用'\0\0\' * n
而不是更直觀的前瞻性[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
當然,你也可以通過進料bytearray
到array
做的更好(比'b'
其他類型的代碼)。與空字節來初始化a bytearray
is by providing an int
as the number of items to initialize一個辦法:
%timeit array('I', bytearray(n))
1000000 loops, best of 3: 1.72 µs per loop
,但是,如果我沒有記錯,初始化字節組的bytearray(int)
方式可能會棄用3.7+
:-)。