2017-12-25 17 views
0

拡張スライス割り当てが通常のスライス割り当てより柔軟性が低いのはなぜですか? <a href="https://docs.python.org/3/whatsnew/2.3.html#extended-slices" rel="nofollow noreferrer">extended slices</a>上のPythonドキュメントによると

あなたはそのようなリストまたはあなたが に割り当てるまたは拡張スライスを削除することができます配列として可変シーケンスを持っていますが、いくつかの違い 割り当て間の延長には、存在する場合定期的なスライス。 正規スライスへの割り当ては、配列の長さを変更するために使用することができる。

>>> a = range(3) 
>>> a 
[0, 1, 2] 
>>> a[1:3] = [4, 5, 6] 
>>> a 
[0, 4, 5, 6] 

拡張スライスは、この柔軟ではありません。拡張 スライスに割り当てる際に、文の右側のリストには、それが交換され、スライスなどの項目の 同じ数含まれている必要があります

>>> a = range(4) 
>>> a 
[0, 1, 2, 3] 
>>> a[::2] 
[0, 2] 
>>> a[::2] = [0, -1] 
>>> a 
[0, 1, -1, 3] 
>>> a[::2] = [0,1,2] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
ValueError: attempt to assign sequence of size 3 to extended slice of size 2 

をなぜ「普通の私は理解していません"スライスメソッドは機能しますが、"拡張 "スライスメソッドは機能しません。 「通常の」スライスを「拡張」スライスと区別するのはなぜですか?また、「拡張された」スライスメソッドが失敗するのはなぜですか?

+1

最初のパラグラフで説明したように、3番目のパラメータであるステップが異なります。ステートメントの右側のリストには、コピーしたテキストに必要とされているスライスと同じ数の項目(3)が置き換えられているため(2)、失敗します。だから彼らはその説明のイラストレーションとしてそれを使うのです。あなたが* "なぜ" *を意味するのかは不明です。 – jonrsharpe

答えて

1

それはあなたが

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

は4項目のリストでどのように動作するかを想像しようとした場合、問題を確認するために少し簡単です:

+---+---+---+---+ + +---+ 
| a | b | c | d |  | ? | 
+---+---+---+---+ + +---+ 
^  ^  ^
+---+  +---+  +---+ 
| 0 |  | 1 |  | 2 | 
+---+  +---+  +---+ 

我々は、すべての3番目の値を交換しようとしていますしかし、私たちのリストは十分ではないので、とにかく前進すれば、いくつかのアイテムが実際には存在しない何らかの奇妙なフランケンシュタインのリストに終わるだろう。誰かがa[5]にアクセスしようとしたときにIndexError(通常はa[6]が機能していても)の場合、は本当にになります。

を1つ拡張することによって、技術的にはa[::2]のケースを取り除くことはできますが、一貫性のために、Pythonは値を渡す場所がない限り、すべての拡張スライスの割り当てを禁止します。

通常のスライスは常に1のストライドを持つため、ギャップが発生する可能性はないため、割り当ては安全に許可されます。

関連する問題