Pythonリスト連結での奇妙な動作

ひまんしゅみしら

私はPythonリストを次のように作成します

>>> list1 = ['a', 'b', 'c']

とセット

>>> list2 = list1

今、私は2つの同様の操作を実行list1し、list2

>>> list1 = list1 + [1, 2, 3]
>>> list1
['a', 'b', 'c', 1, 2, 3]
>>> list2
['a', 'b', 'c']

そして

>>> list2 += [1,2,3]
>>> list1
['a', 'b', 'c', 1, 2, 3]
>>> list2
['a', 'b', 'c', 1, 2, 3]

ただし、どちらの場合も結果は異なります。その理由は何ですか?

ひまんしゅみしら

この背後にある理由は、クラスの2つの異なるメソッド、methodmethod+=+呼び出すためです。__iadd____add__

APIの観点からは、iaddは、変更可能なオブジェクトを適切に変更する(変更されたオブジェクトを返す)ために使用されることになっていますが、addは何かの新しいインスタンスを返す必要があります。不変オブジェクトの場合、どちらのメソッドも新しいインスタンスを返しますが、iaddは、古いインスタンスと同じ名前で現在の名前空間に新しいインスタンスを配置します。これが理由です

i = 1
i += 1

iをインクリメントするようです。実際には、新しい整数を取得し、それをiの「上」に割り当てます。つまり、古い整数への参照が1つ失われます。この場合、i + = 1はi = i + 1とまったく同じです。ただし、ほとんどの可変オブジェクトでは、話が異なります。

具体的な例として:

a = [1, 2, 3]
b = a
b += [1, 2, 3]
print a  #[1, 2, 3, 1, 2, 3]
print b  #[1, 2, 3, 1, 2, 3]

に比べ:

a = [1, 2, 3]
b = a
b = b + [1, 2, 3]
print a #[1, 2, 3]
print b #[1, 2, 3, 1, 2, 3]

最初の例では、bと参照が同じオブジェクトを参照しているため、bで+ =を使用すると、実際にbが変更されます(そして、aもその変更を確認します-結局のところ、同じリストを参照しています)。ただし、2番目のケースでは、b = b + [1、2、3]を実行すると、bが参照しているリストが取得され、新しいリスト[1、2、3]と連結されます。次に、連結されたリストを現在の名前空間にbとして格納します-以前の行が何であったかは関係ありません。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Pythonリストの奇妙な動作

分類Dev

奇妙なnull文字列の連結動作

分類Dev

Pythonでリストとタプルを連結する一貫性のない動作

分類Dev

Pythonがリストの奇妙な動作で要素のランクを取得する

分類Dev

配列のリストでのContains()の奇妙な動作

分類Dev

Python:リスト内包表記の奇妙な動作

分類Dev

不変リストを使用したPythonの奇妙な動作

分類Dev

MVC投稿リストでの奇妙な動作

分類Dev

PHP匿名オブジェクトの文字列を連結する奇妙な動作

分類Dev

Python:奇妙な振る舞いをする2つのリストの連結

分類Dev

Python。ネストされた辞書へのリスト:奇妙な動作

分類Dev

Pythonのネストされたリストを含む奇妙な動作

分類Dev

Pythonリストを追加するときの奇妙なpymongoの動作

分類Dev

Visual Studio2013でのC ++ 11リストの初期化の奇妙な動作

分類Dev

文字列連結中の奇妙な動作を強調する

分類Dev

bashスクリプトでの「jobs」コマンドの奇妙な動作

分類Dev

リストを反復処理してPythonで要素を削除するときの奇妙な動作

分類Dev

シェルスクリプトでの奇妙な「エコー」動作

分類Dev

NodeJSのifステートメントでの奇妙な動作

分類Dev

Pythonセット操作の奇妙な動作

分類Dev

並列ストリームのStream.spliteratorの奇妙な動作

分類Dev

特定のCSSを使用したHTMLリストの奇妙な動作

分類Dev

Python辞書での奇妙な動作

分類Dev

C#での奇妙なデリゲートの動作

分類Dev

奇妙な方法で動作するキュウリテスト

分類Dev

bashで奇妙な動作をするスプリット

分類Dev

QMLテキストの奇妙な動作

分類Dev

Linuxソートでの奇妙な動作

分類Dev

リストビューの背景を変更-奇妙な動作

Related 関連記事

  1. 1

    Pythonリストの奇妙な動作

  2. 2

    奇妙なnull文字列の連結動作

  3. 3

    Pythonでリストとタプルを連結する一貫性のない動作

  4. 4

    Pythonがリストの奇妙な動作で要素のランクを取得する

  5. 5

    配列のリストでのContains()の奇妙な動作

  6. 6

    Python:リスト内包表記の奇妙な動作

  7. 7

    不変リストを使用したPythonの奇妙な動作

  8. 8

    MVC投稿リストでの奇妙な動作

  9. 9

    PHP匿名オブジェクトの文字列を連結する奇妙な動作

  10. 10

    Python:奇妙な振る舞いをする2つのリストの連結

  11. 11

    Python。ネストされた辞書へのリスト:奇妙な動作

  12. 12

    Pythonのネストされたリストを含む奇妙な動作

  13. 13

    Pythonリストを追加するときの奇妙なpymongoの動作

  14. 14

    Visual Studio2013でのC ++ 11リストの初期化の奇妙な動作

  15. 15

    文字列連結中の奇妙な動作を強調する

  16. 16

    bashスクリプトでの「jobs」コマンドの奇妙な動作

  17. 17

    リストを反復処理してPythonで要素を削除するときの奇妙な動作

  18. 18

    シェルスクリプトでの奇妙な「エコー」動作

  19. 19

    NodeJSのifステートメントでの奇妙な動作

  20. 20

    Pythonセット操作の奇妙な動作

  21. 21

    並列ストリームのStream.spliteratorの奇妙な動作

  22. 22

    特定のCSSを使用したHTMLリストの奇妙な動作

  23. 23

    Python辞書での奇妙な動作

  24. 24

    C#での奇妙なデリゲートの動作

  25. 25

    奇妙な方法で動作するキュウリテスト

  26. 26

    bashで奇妙な動作をするスプリット

  27. 27

    QMLテキストの奇妙な動作

  28. 28

    Linuxソートでの奇妙な動作

  29. 29

    リストビューの背景を変更-奇妙な動作

ホットタグ

アーカイブ