2016-11-07 6 views

答えて

6

この関数は16ビットの配列を返します。したがって、\0\0はおそらく2バイト(16ビット)のデータを作成することを意味します。つまり、2バイトのnワードを返します。

10

arrayクラスは、フォーマット文字(型コードと呼ばれる)とそれに続くイニシャライザを受け入れます。 Hは、最小サイズが2バイトの符号なしshortを意味するので、'\0\0'がそれを満たします。 * n部分は、配列全体をNULLバイトに初期化することです。

7

2バイトが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で、こと、あなたがarrayからinitializer引数としてあなた必見provide a bytes objectを動作させる同じスニペットが必要な場合:

>>> 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でちょうど別の文字列です。この動作の別の例として


64bit2バイトの最小値を有する符号無しのint用'I'が、4の型コードの配列の初期化を取るのPythonのビルド。あなたが提供してきたスニペットの精神で

、あなたはこのような何かやって配列を初期化したい:10要素を取得するための

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

はい、4回b'\0'文字列を。最終注意点として


から次のタイミングでは、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 

、あなたはarraybytearrayを供給することによって('b'以外のタイプのコードのために)良く行うことができます。 NULLバイトで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のを初期化するbytearray(int)方法が3.7+ :-)で非推奨になり得るかもしれません。

関連する問題