Python でのコピーなしの部分リスト スライス
Python のリスト スライス操作では、コピーを作成するのではなく、元のリストの要素への参照が生成されます。この動作は、スライスによってリスト内の要素のオブジェクト ID が保持されるという事実に由来します。
デモ
これを説明するために、次のリストを考えてみましょう。
<code class="python">L = [1000 + 1, 1000 + 1, 1000 + 1]</code>
これらの整数は同じ値であっても、別個のものですオブジェクト:
<code class="python">map(id, L) [140502922988976, 140502922988952, 140502922988928]</code>
リストのスライスは単に参照をコピーします:
<code class="python">b = L[1:3] map(id, b) [140502922988952, 140502922988928]</code>
スライスのメモリ オーバーヘッド
スライスでは作成されませんオブジェクトのコピーには、参照のコピーが含まれます。これらの参照により、リストに関連する全体的なメモリ オーバーヘッドが増加します。
<code class="python">for i in range(len(L)): x = L[:i] print('len: {}'.format(len(x))) print('size: {}'.format(sys.getsizeof(x)))</code>
このオーバーヘッドは、特に大きなリストや辞書などのメモリを大量に使用するオブジェクトを操作する場合に蓄積される可能性があります。
代替: Views
Python には、リストのビューやエイリアスを作成する簡単な方法がありません。ただし、NumPy 配列はこの機能を提供します。 NumPy 配列をスライスすると、元の配列とメモリを共有するビューが作成されます。これによりメモリを大幅に節約できますが、オブジェクトを変更するときに潜在的な落とし穴が生じます。
以上がPython リストのスライスではコピーまたは参照が作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。