リストをスライスすると新しいコピーが作成されるように見えるかもしれませんが、根底にある真実はまったく同じです。違う。 Python のスライス メカニズムは、リスト要素への参照を複製するのではなく、保持します。この動作は、不変値と可変値の両方に適用されます。
整数オブジェクトを含むリストを考えます:
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)))
オーバーヘッドにもかかわらず、リストのスライスは、完全に新しいリストを作成するよりも効率的なアプローチです。
Python には、リスト ビューを作成するネイティブな方法がありません。ただし、numpy 配列は、スライスと元の配列間でメモリを共有することでメモリを節約するソリューションを提供します。元の配列に加えられた変更はスライスに反映されます:
import numpy a = numpy.arange(3) b = a[1:3] a[2] = 1001 b # Output: array([ 1, 1001])
ただし、ビューの使用には、意図しない変更を避けるために慎重な考慮が必要です。
以上がPython のリスト スライスではコピーが作成されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。