ホームページ  >  記事  >  バックエンド開発  >  Python リストのスライスではオブジェクトのコピーが作成されますか?

Python リストのスライスではオブジェクトのコピーが作成されますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-06 07:01:03958ブラウズ

 Does Python List Slicing Create Copies of Objects?

Python でのリストのスライス: オブジェクトの整合性の維持

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:])

スライスは元の参照を保持しており、スライスがコピー操作ではないことを示しています。

コピーのオーバーヘッド< ;/h3>

スライスにはオブジェクト自体のコピーは含まれませんが、参照はコピーされます。各参照は 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。