Python でリストをスライスすると、オブジェクトが含まれていますが、実際にはそうではありません。代わりに、スライスすると、同じ基礎となるオブジェクトを参照する新しいリストが単純に生成されます。この認識は、Python のリスト スライス メカニズムを理解する上で重要な役割を果たします。
整数のリストを考えてみましょう:
[1000 + 1, 1000 + 1, 1000 + 1]
同じ値を持っているにもかかわらず、次のことからわかるように、これらのオブジェクトは一意の ID を持つ別個のエンティティです:
map(id, [1000 + 1, 1000 + 1, 1000 + 1])
このリストをスライスすると、これらの参照の整合性が維持されます:
b = [1000 + 1, 1000 + 1, 1000 + 1][1:3] map(id, b)
両方のマップ操作の出力は同一であり、スライスが整数の新しいコピーを生成していないことを確認します。
同様の動作が観察されます辞書やリストなどの変更可能なオブジェクトの場合:
a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']] map(id, a[1:])
スライスは元の参照を保持しており、スライスがコピー操作ではないことを示しています。
スライスにはオブジェクト自体のコピーは含まれませんが、参照はコピーされます。各参照は 64 ビット マシン上で 8 バイトを占有し、各リストにはさらに 72 バイトのオーバーヘッドがあります。
for i in range(len(a)): x = a[:i] print('len: {}'.format(len(x))) print('size: {}'.format(sys.getsizeof(x)))
ただし、このオーバーヘッドは、通常、ほとんどのアプリケーションにとって重大な問題ではありません。
Python にはビューの直接サポートがありませんが、numpy 配列などの代替オプションを使用してメモリの最適化を実現できます。 numpy 配列をスライスすると、元のビューとメモリを共有するビューが作成され、オーバーヘッドが削減されますが、意図しない変更が行われる可能性が生じます。
要約すると、Python でリストをスライスすると、含まれるオブジェクトへの参照が保持され、コストのかかるコピー操作が回避されます。このメカニズムにより、元のリストに加えられた変更がスライスに確実に反映されるため、コードのメンテナンスが簡素化されます。メモリのオーバーヘッドは考慮事項ですが、ほとんどの実用的なアプリケーションでは通常、大きな問題ではありません。
以上がPython リストのスライスではオブジェクトのコピーが作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。