代入演算子の左側/右側でのさまざまなスライス動作

h9uest

C ++のバックグラウンドから来たPython初心者として、Python(3.4.x)のスライス演算子は私にはばかげているように見えます。「特別ルール」の背後にあるデザイン哲学がわからない。なぜ「特別」と言うのか説明させてください。

一方では、ここでのスタックオーバーフローの回答によると、スライスオペレーターは、リストまたはリストの一部、つまり新しいリストの(深い)コピーを作成します。リンクは古い可能性があります(python 3.4.xより前)が、Python3.4.2を使用した次の簡単な実験で動作を確認しました。

words = ['cat', 'window', 'defenestrate']
newList = words[:] # new objects are created; a.k.a. deep copy
newList[0] = 'dog'

print(words) # ['cat' ...
print(newList) # ['dog' ...

一方、ここの公式ドキュメントによると

Assignment to slices is also possible, and this can even change the size of the list or clear it entirely:
>>>

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> letters[:] = []
>>> letters 
[]

明らかに、スライス演算子[:]はここでディープコピーを実行しません。

観察から、スライス演算子が代入演算子に対して左側/右側にある場合、異なる動作を生成することが示唆されているようです。演算子が同様の動作を生成できる言語を私は知りません。結局のところ、演算子は関数であり、構文的に特別な関数であり、関数の動作は自己完結型であり、純粋にそのすべての入力によって決定される必要があります。

では、Pythonの設計哲学におけるこの「特別なルール」を正当化できるものは何でしょうか。

PS私の結論が正しくない場合、実際には2つの可能性しかありません。

1、Pythonのスライシング '演算子'は実際には演算子ではないので、私の仮定は成り立たない---それではそれは何[:]ですか( 'スライシング演算子' )?

2、行動の違いは、観察されていないいくつかの潜在的な要因によって引き起こされます。割り当て演算子に対するスライス演算子の位置(左側/右側)は、さまざまな動作の観察と誤って共存します。彼らは因果関係を持っていません---それでは、行動の違いを引き起こす潜在的な要因は何ですか?

jonrsharpe

Python演算子は、「魔法の」メソッドの構文糖衣構文と見なすのが最適です。たとえば、x + yはとして評価されx.__add__(y)ます。同じように:

  • foo = bar.bazになりfoo = bar.__getattr__(baz)ます; 一方、
  • bar.baz = fooになりbar.__setattr__(baz, foo)ます;

Pythonの「スライス演算子」 *a[b]は次のいずれかとして評価されます。

  • a.__getitem__(b); または
  • a.__setitem__(b, ...);

割り当てのどちら側にあるかによって異なります。この2つはまったく同じではありませんPythonリストスライスでの割り当てのしくみも参照してください)。したがって「手書き」書かれています。

>>> x = [1, 2, 3]
>>> x.__getitem__(slice(None))  # ... = x[:]
[1, 2, 3]
>>> x.__setitem__(slice(None), (4, 5, 6))  # x[:] = ...
>>> x
[4, 5, 6]

データモデルのマニュアルには詳細(例えば、これらの方法を説明します__getitem__)、あなたは読むことができます上のドキュメントをsliceあまりにも、。


以下に示すように、スライスは深いコピーではなく浅いコピーあることに注意してください

>>> foo = [[], []]
>>> bar = foo[:]
>>> bar is foo
False  # outer list is new object
>>> bar[0] is foo[0]
True  # inner lists are same objects
>>> bar[0].append(1)
>>> foo
[[1], []]

*まあ、厳密に演算子ではありません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

代入演算子の右側の前に添え字が評価されますか

分類Dev

関数を代入演算子の左側に置くことはできますか?

分類Dev

なぜ三項演算子は、代入(左側の変数)なしで使用することはできませんか?

分類Dev

PycharmはEclipseのような代入演算子の左側をオートコンプリートできますか?

分類Dev

なぜC ++は左側から代入演算子の右側のテンプレート引数を推定できるのですか?

分類Dev

演算子+ =の右側に初期化リストを使用できますが、演算子+は使用できないのはなぜですか?

分類Dev

Pygame:一部のスプライトが画面の右側で動かなくなっています

分類Dev

BCE0051:演算子「<」は、タイプ「オブジェクト」の左側とタイプ「フロート」の右側では使用できません。

分類Dev

内側のdivを外側のdivの内側で完全な高さで上下にスライドさせます

分類Dev

Scalaの代入演算子の両側でオブジェクトをインスタンス化します。それはどのように機能しますか

分類Dev

代入演算子の左側でEclipseをオートコンプリートできますか?

分類Dev

右側の大きなテキストが左側の画像にプッシュされます

分類Dev

RecyclerViewは、単一のアイテムを右側にとどまらせるのではなく、左側に移動させます

分類Dev

代入演算子の左側にある三項条件演算子

分類Dev

条件の右側で使用された場合、演算子は何をしますか?

分類Dev

in演算子の左側になるクラスをオーバーライドする

分類Dev

左側のデルタと右側の異なるデルタによってリンクされているクラスターを特定します

分類Dev

左側に「逆参照」演算子と「アドレス」演算子があるのはなぜですか?

分類Dev

モバイルでは、右側のブートストラップを左側のdivの上に表示する必要があります

分類Dev

さまざまな幅のテキストの右側にあるUnityスティック画像

分類Dev

代入演算子の左側にあるPythonの複数の変数

分類Dev

Dart / Flutterリストの左側、右側のコンパイラエラー

分類Dev

BYTESのビット単位の二項演算子には、同じ長さの入力が必要です。左側に16バイト、右側に4バイトを取得しました

分類Dev

ムーブ代入で左側のstd :: vectorリソースはどうなりますか?

分類Dev

Outlook2019の余分なスペース。右側と左側

分類Dev

Iosはラベル(曲のタイトル)を右側から左側に移動しますか?

分類Dev

複合代入演算子は子スコープでどのように動作しますか?

分類Dev

左側ではなく右側のすべての兄弟を削除しますJQUERYJAVASCRIPT

分類Dev

Windows7でのWindowsエクスプローラーの左側のペインの動作

Related 関連記事

  1. 1

    代入演算子の右側の前に添え字が評価されますか

  2. 2

    関数を代入演算子の左側に置くことはできますか?

  3. 3

    なぜ三項演算子は、代入(左側の変数)なしで使用することはできませんか?

  4. 4

    PycharmはEclipseのような代入演算子の左側をオートコンプリートできますか?

  5. 5

    なぜC ++は左側から代入演算子の右側のテンプレート引数を推定できるのですか?

  6. 6

    演算子+ =の右側に初期化リストを使用できますが、演算子+は使用できないのはなぜですか?

  7. 7

    Pygame:一部のスプライトが画面の右側で動かなくなっています

  8. 8

    BCE0051:演算子「<」は、タイプ「オブジェクト」の左側とタイプ「フロート」の右側では使用できません。

  9. 9

    内側のdivを外側のdivの内側で完全な高さで上下にスライドさせます

  10. 10

    Scalaの代入演算子の両側でオブジェクトをインスタンス化します。それはどのように機能しますか

  11. 11

    代入演算子の左側でEclipseをオートコンプリートできますか?

  12. 12

    右側の大きなテキストが左側の画像にプッシュされます

  13. 13

    RecyclerViewは、単一のアイテムを右側にとどまらせるのではなく、左側に移動させます

  14. 14

    代入演算子の左側にある三項条件演算子

  15. 15

    条件の右側で使用された場合、演算子は何をしますか?

  16. 16

    in演算子の左側になるクラスをオーバーライドする

  17. 17

    左側のデルタと右側の異なるデルタによってリンクされているクラスターを特定します

  18. 18

    左側に「逆参照」演算子と「アドレス」演算子があるのはなぜですか?

  19. 19

    モバイルでは、右側のブートストラップを左側のdivの上に表示する必要があります

  20. 20

    さまざまな幅のテキストの右側にあるUnityスティック画像

  21. 21

    代入演算子の左側にあるPythonの複数の変数

  22. 22

    Dart / Flutterリストの左側、右側のコンパイラエラー

  23. 23

    BYTESのビット単位の二項演算子には、同じ長さの入力が必要です。左側に16バイト、右側に4バイトを取得しました

  24. 24

    ムーブ代入で左側のstd :: vectorリソースはどうなりますか?

  25. 25

    Outlook2019の余分なスペース。右側と左側

  26. 26

    Iosはラベル(曲のタイトル)を右側から左側に移動しますか?

  27. 27

    複合代入演算子は子スコープでどのように動作しますか?

  28. 28

    左側ではなく右側のすべての兄弟を削除しますJQUERYJAVASCRIPT

  29. 29

    Windows7でのWindowsエクスプローラーの左側のペインの動作

ホットタグ

アーカイブ