118

Python docs によると、リストをスライスすると新しいリストが返されます。
「新しい」リストが返されている場合、「スライスへの割り当て」に関連する次の質問があります

a = [1, 2, 3]
a[0:2] = [4, 5]
print a

出力は次のようになります。

[4, 5, 3] 
  1. 何かを返す何かがどうして式の左側に来るのでしょうか?
  2. はい、ドキュメントを読みましたが、リストをスライスすると「新しい」リストが返されるため、元のリストが変更されるのはなぜですか? その背後にあるメカニズムを理解できません。
4

5 に答える 5

140

非常によく似た構文を使用する 2 つの異なる操作を混同しています。

1) スライス:

b = a[0:2]

これにより、 のスライスのコピーが作成aされ、 に割り当てられbます。

2) スライスの割り当て:

a[0:2] = b

これにより、 のスライスがの内容に置き換えられます。ab

構文は似ていますが (設計上は想像できます!)、これらは 2 つの異なる操作です。

于 2012-05-16T17:09:24.783 に答える
82

a演算子の左側に指定すると、 =Python の通常の割り当てが使用され、現在のコンテキスト内の名前aが新しい値を指すように変更されます。これは、a指していた以前の値を変更しません。

a[0:2]演算子の左側に指定することで、スライス代入=を使用することを Python に伝えます。スライス割り当ては、リストのコンテンツを挿入、削除、または置換できるリストの特別な構文です。

挿入:

>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]

削除:

>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]

交換:

>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]

ノート:

スライスの長さは、割り当てられたシーケンスの長さとは異なる場合があり、ターゲット シーケンスで許可されている場合は、ターゲット シーケンスの長さが変更されます。-ソース

スライスの割り当ては、タプルのアンパックと同様の機能を提供します。たとえば、a[0:1] = [4, 5]次と同等です。

# Tuple Unpacking
a[0], a[1] = [4, 5]

タプルのアンパックを使用すると、連続していないリストを変更できます。

>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]

ただし、要素を挿入または削除できないため、タプルのアンパックは置換に限定されます。

これらすべての操作の前後aは、まったく同じリストです。Python は、リストをその場で変更するための優れた構文糖衣を提供するだけです。

于 2012-05-16T17:12:12.483 に答える
5

割り当て操作の左側でスライスすることにより、割り当てる項目を指定しています。

于 2012-05-16T17:08:30.810 に答える
1

を行ったとき、 (スライス) の左側に, の右側の値a[0:2] = [4,5]を割り当てました。=a[0:2]=[4,5]

于 2021-10-10T17:29:47.723 に答える