ホームページ >バックエンド開発 >Python チュートリアル >Python リストのスライスではコピーまたは参照が作成されますか?

Python リストのスライスではコピーまたは参照が作成されますか?

DDD
DDDオリジナル
2024-11-08 14:32:02866ブラウズ

Does Python List Slicing Create Copies or References?

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 サイトの他の関連記事を参照してください。

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