Pythonには、メモリ配列やバッファへのアクセスをラップするオブジェクトがあります。これらのオブジェクトには、組み込みのbytesやbytearray、そして一部の拡張型のようなものが含まれます。これらのオブジェクトは、大きなメモリバッファによってバックアップされる共通の特性を共有しています。
Pythonの buffer
型は、このようなオブジェクトの一つで、特定のオブジェクト(文字列、配列、バッファなど)を参照する新しいバッファオブジェクトを作成します。このバッファオブジェクトは、オブジェクトの始まり(または指定されたオフセット)からのスライスになります。このスライスは、オブジェクトの終わりまで(または、size引数によって与えられた長さまで)広がります。
例えば、次のように使用することができます:
s = 'Hello world'
t = buffer(s, 6, 5)
print(t) # Output: world
この場合、バッファはサブストリングで、位置6から長さ5のもので、追加のストレージスペースを取らずに、文字列のスライスを参照します。これは短い文字列の場合にはあまり役に立ちませんが、大量のデータを使用する場合には必要になることがあります。
また、次のようにmutableなbytearrayを使用した例もあります:
s = bytearray(1000000) # a million zeroed bytes
t = buffer(s, 1) # slice cuts off the first byte
s[1] = 5 # set the second element in s
print(t[0]) # Output: '\x05'
このような使い方は、データに対して複数のビューを持ちたい場合や、メモリに複数のコピーを保持したくない(またはできない)場合に非常に役立ちます。
ただし、Python 3では buffer
は memoryview
に置き換えられています。また、自分のオブジェクトに対してバッファインターフェースを実装することは、C APIに深く踏み込むことなく、純粋なPythonではできません。
以上がPythonの buffer
型についての基本的な説明です。この情報がPythonプログラミングにおける理解の一助となれば幸いです。