問題:
整数のリストが与えられた場合、その整数のすべてのサブリストを生成します。 [0, len(L)-1] の k に対して L[k:] を作成せずに効率的に形成します
答え:
Python でリストをスライスしても、基になるオブジェクトのコピーは生成されず、オブジェクトへの参照のみが生成されます。
これを実証するために、同じ値を持つ 3 つの整数オブジェクトを考えてみましょう。値:
a = [1000 + 1, 1000 + 1, 1000 + 1]
これらは個別のオブジェクト ID を持ち、別個のオブジェクトであることを示します:
map(id, a) # returns [140502922988976, 140502922988952, 140502922988928]
これらのオブジェクトをスライスすると、同じ参照を持つ新しいリスト オブジェクトが生成され、新しいリスト オブジェクトがないことがわかります。オブジェクトが作成されました:
b = a[1:3] map(id, b) # returns [140502922988952, 140502922988928]
この動作は、不変 (整数など) と可変の両方に適用されます。 (リストなど) 値。
スライスでは新しいオブジェクトは生成されませんが、参照のコピーとリストのメタデータの維持により、ある程度のメモリ オーバーヘッドが発生します。たとえば、N 個の要素を持つリストには 72 バイトのメモリ オーバーヘッドがあります。
メモリの最適化が重要な場合は、numpy 配列をスライスするため、リストの代わりに numpy 配列を使用することを検討してください。スライスと元の配列の間でメモリを共有します。ただし、このアプローチでは、不用意な変更を避けるために慎重な取り扱いが必要です。
Python でのリストのスライスは、基礎となるオブジェクトのコピーを生成しない効率的な操作です。パフォーマンスの最適化を検討するときは、この動作を考慮する必要があります。
以上がPython でリストをスライスすると、基になるオブジェクトのコピーが作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。