:Pythonの ' 0 0'の意味ですか?私はサードパーティのAPIを見ていることだし、彼らは次のコードを持っている
def array_u16 (n): return array('H', '\0\0'*n)
私は'\0'
がNULL
を意味することを理解し、'\0\0'
は特別な意味を持っていないか、それだけで2 NULL
秒を意味するのでしょうか?
:Pythonの ' 0 0'の意味ですか?私はサードパーティのAPIを見ていることだし、彼らは次のコードを持っている
def array_u16 (n): return array('H', '\0\0'*n)
私は'\0'
がNULL
を意味することを理解し、'\0\0'
は特別な意味を持っていないか、それだけで2 NULL
秒を意味するのでしょうか?
この関数は16ビットの配列を返します。したがって、\0\0
はおそらく2バイト(16ビット)のデータを作成することを意味します。つまり、2バイトのnワードを返します。
array
クラスは、フォーマット文字(型コードと呼ばれる)とそれに続くイニシャライザを受け入れます。 H
は、最小サイズが2バイトの符号なしshortを意味するので、'\0\0'
がそれを満たします。 * n
部分は、配列全体をNULLバイトに初期化することです。
2バイトが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
で、こと、あなたが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でちょうど別の文字列です。この動作の別の例として
、64bit
で2
バイトの最小値を有する符号無しの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
、あなたはarray
にbytearray
を供給することによって('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+
:-)で非推奨になり得るかもしれません。