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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-10 03:04:02559ブラウズ

 Does Python's List Slicing Create Copies?

コピーせずに Python でリストをスライスする: 探索

リストをスライスすると新しいコピーが作成されるように見えるかもしれませんが、根底にある真実はまったく同じです。違う。 Python のスライス メカニズムは、リスト要素への参照を複製するのではなく、保持します。この動作は、不変値と可変値の両方に適用されます。

gt;不変値と可変値のテスト

整数オブジェクトを含むリストを考えます:

a = [1000 + 1, 1000 + 1, 1000 + 1]

同じ値を持っているにもかかわらず、各整数は一意の ID を持つ個別のオブジェクトです:

map(id, a)
[140502922988976, 140502922988952, 140502922988928]

リストをスライスすると、

b = a[1:3]

スライス内のオブジェクトの ID が次のようになります。元のリストのものと同じです。コピーは作成されていません。

同様に、辞書などの変更可能な値も同じように動作します。

a = [{0: 'zero', 1: 'one'}, ['foo', 'bar']]
map(id, a)
[4380777000, 4380712040]

map(id, a[1:]
... )
[4380712040]

最小限のメモリ オーバーヘッド

オブジェクト参照はスライス中にコピーされ、そのサイズは一定のままです (64 ビット マシンでは 8 バイト)。さらに、各リストには 72 バイトのオーバーヘッドがあります。このオーバーヘッドは、スライスが作成されるたびに増加します。

for i in range(len(a)):
    x = a[:i]
    print('len: {}'.format(len(x)))
    print('size: {}'.format(sys.getsizeof(x)))

オーバーヘッドにもかかわらず、リストのスライスは、完全に新しいリストを作成するよりも効率的なアプローチです。

ビューと Numpy 配列< ;/h3>

Python には、リスト ビューを作成するネイティブな方法がありません。ただし、numpy 配列は、スライスと元の配列間でメモリを共有することでメモリを節約するソリューションを提供します。元の配列に加えられた変更はスライスに反映されます:

import numpy

a = numpy.arange(3)
b = a[1:3]

a[2] = 1001
b  # Output: array([   1, 1001])

ただし、ビューの使用には、意図しない変更を避けるために慎重な考慮が必要です。

以上がPython のリスト スライスではコピーが作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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