2016-11-07 6865 views
8

我期待在一個第三方API,他們有下面的一段代碼:Python中' 0 0'的含義?

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

我明白'\0'意味着NULL,確實'\0\0'有什麼特殊的含義或者它僅僅意味着2個NULL S'

回答

6

它看起來像這個函數返回一個由16位構成的數組;因此\0\0可能代表創建兩個字節(即16位)的數據。換句話說,它返回兩個字節的n個字。

10

array類接受一個格式字符(稱爲typecode),後跟一個初始值設定項。 H表示一個無符號的短符號,最小大小爲2個字節,所以'\0\0'就滿足了。 * n部分是將整個數組初始化爲NULL字節。

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構建的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 

當然,你也可以通過進料bytearrayarray做的更好(比'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+ :-)。