9
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> u = [4, 5, 6, 7, 8, 9]
>>> u[1::1] = [3, 2, 1, 0]
>>> u
[4, 3, 2, 1, 0]
>>> u[9:0:-1] = [8, 7, 6, 5]
>>> u
[4, 5, 6, 7, 8]
>>> u[9:0:-1] = [16, 12, 8]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 3 to extended slice of size 4
>>> u
[4, 5, 6, 7, 8]
>>>

予想される動作: 最後の割り当てステートメントで例外がスローされません。uとして最終行に出力する必要があります[4, 8, 12, 16]

割り当てている iterable が「間違った長さ」であっても、ステップが 1 の拡張スライスに割り当てることができます。では、ステップが -1 である拡張スライスに割り当てて、それを明白な方法で動作させることができないのはなぜですか?

4

1 に答える 1

3

ステップが 1 の拡張スライスを作成すると、拡張スライスではなく、通常のスライスのように効果的に機能すると思います。

こちらに記載されているように、拡張されたスライスではシーケンスの長さを変更できません。

リストや配列などの変更可能なシーケンスがある場合は、拡張スライスに割り当てたり削除したりできますが、拡張スライスと通常のスライスへの割り当てにはいくつかの違いがあります。通常のスライスへの割り当てを使用して、シーケンスの長さを変更できます。 拡張スライスはそれほど柔軟ではありません。拡張されたスライスに割り当てる場合、ステートメントの右側のリストには、置き換えるスライスと同じ数の項目が含まれている必要があります。

なぜこのように動作するのかについては、明らかな動作がない場合が原因であると推測できます。次の例を見てください。

u = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
u[0:8:3] = [ 10, 11 ]

これがどのように機能すると思いますか?1 と 4 を 10 と 11 に置き換えるだけでよいと思いますが、7 はどうでしょうか。あなたはそれを残しますか?消して?シーケンスの 7 以降をすべて削除しますか? 私だけかもしれませんが、このケースはあまり明確ではないようです。私が推測するのは、この種の動作が拡張スライスで許可されなかった理由です。

于 2012-06-09T18:49:25.173 に答える