1. ホーム
  2. python

[解決済み] Pythonのバッファタイプは何のためにあるのですか?

2022-05-12 03:46:36

質問

ある buffer 型がありますが、どのように使用すればよいのかわかりません。

Pythonドキュメント という記述があります。

buffer(object[, offset[, size]])

object 引数は buffer 呼び出しインタフェースをサポートするオブジェクトでなければなりません (文字列、配列、buffer など)。object 引数を参照する新しい buffer オブジェクトが作成されます。バッファオブジェクトは、オブジェクトの先頭から(または指定されたオフセットから)スライスされます。スライスはオブジェクトの終わりまで拡張されます(または size 引数で指定された長さを持ちます)。

どのように解決するのですか?

使用例です。

>>> s = 'Hello world'
>>> t = buffer(s, 6, 5)
>>> t
<read-only buffer for 0x10064a4b0, size 5, offset 6 at 0x100634ab0>
>>> print t
world

この場合のバッファは、長さ5で位置6から始まる部分文字列で、余分なストレージスペースを取りません - それは文字列のスライスを参照します。

このような短い文字列ではあまり役に立ちませんが、大量のデータを使うときには必要な場合があります。この例では、ミュータブルな 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
>>> t[0]                     # which is now also the first element in t!
'\x05'

これは、データに対して複数のビューを持ちたいが、メモリに複数のコピーを保持したくない(あるいは保持できない)場合に非常に便利です。

以下のことに注意してください。 buffer は、より良い名前の memoryview に置き換えられましたが、Python 2.7ではどちらも使うことができます。

また、C APIを掘り下げることなく、独自のオブジェクトのためにバッファインターフェースを実装できないこと、つまり、純粋なPythonでそれを行うことができないことに注意してください。