Pythonリストの奇妙な動作

snehakandpal

リストの対角要素を1に設定しようとしましたが、すべての要素が1として割り当てられました。

a = [[0]*3]*3
print(a)  #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(len(a)):
    a[i][i] = 1
print(a)  #[[1, 1, 1], [1, 1, 1], [1, 1, 1]

ただし、次の方法で問題なく動作します。

a = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
print(a)  #[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(len(a)):
    a[i][i] = 1
print(a)  #[[1, 0, 0], [0, 1, 0], [0, 0, 1]]

なぜこれが起こっているのか考えはありますか?

Akshay Sehgal

浅いコピーと深いコピー(またはこの場合は浅いコピーと明示的な割り当て)の違いを理解すれば、この動作を理解するのは非常に簡単です。

公式ドキュメントから-

その理由は、*を使用してリストを複製してもコピーは作成されず、既存のオブジェクトへの参照のみが作成されるためです。* 3は、長さ2の同じリストへの3つの参照を含むリストを作成します。

2番目のケースでは、リストのリスト内の各要素を明示的に割り当てています。一方を変更しても、もう一方には影響しません。

#EXPLICIT ASSIGNMENT!
a = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

for i in range(len(a)):
    a[i][i] = 1

しかし、最初のケースでは、*オペレータは、浅いコピー作成[0](およびその後の浅いコピー[0,0,0]も同様)。

#REPETITION OPERATOR
a = [[0]*3]*3

for i in range(len(a)):
    a[i][i] = 1

これは、ある理由あなたは、この動作を参照してください理由。深いコピー(または明示的な割り当て2番目の場合のように)は、まず新しいコレクションオブジェクトを作成し、次に再帰的に子オブジェクトのコピーを移入元で見つかりました。ディープコピーの場合、オブジェクトのコピーが他のオブジェクトにコピーされます。これは、オブジェクトのコピーに加えられた変更が元のオブジェクトに反映されないことを意味します。

ここに画像の説明を入力してください

最初のケースでは、浅いコピーを使用して新しいコレクションオブジェクトを作成し、元のオブジェクトにある子オブジェクトへの参照をそのオブジェクトに入力します。コピープロセスは繰り返されないため、子オブジェクト自体のコピーは作成されません。浅いコピーの場合、オブジェクトの参照は他のオブジェクトにコピーされます。これは、オブジェクトのコピーに加えられた変更が元のオブジェクトに反映されることを意味します。

ここに画像の説明を入力してください

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

QMLテキストの奇妙な動作

分類Dev

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

分類Dev

LibGDXスクリーンショットの奇妙な動作

分類Dev

LibGDXスクリーンショットの奇妙な動作

分類Dev

SwiftUI静的リストの奇妙な再利用動作

分類Dev

データリストの奇妙な動作

分類Dev

Axios.getリクエストの奇妙な動作

分類Dev

ツールストリップボタンの奇妙な動作

分類Dev

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

分類Dev

リストビューを使用したJqueryMobileの奇妙な動作

分類Dev

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

分類Dev

奇妙なbashスクリプトの動作

分類Dev

奇妙なJQueryスクリプトの動作

分類Dev

リストを使用したEntityFrameworkの奇妙な動作

分類Dev

Bash ログオン スクリプトの奇妙な動作

分類Dev

iOS javascriptPOSTリクエストの奇妙な動作

分類Dev

奇妙なPythonデストラクタの動作

分類Dev

Python: locals() の奇妙な動作

Related 関連記事

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

    QMLテキストの奇妙な動作

  13. 13

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

  14. 14

    LibGDXスクリーンショットの奇妙な動作

  15. 15

    LibGDXスクリーンショットの奇妙な動作

  16. 16

    SwiftUI静的リストの奇妙な再利用動作

  17. 17

    データリストの奇妙な動作

  18. 18

    Axios.getリクエストの奇妙な動作

  19. 19

    ツールストリップボタンの奇妙な動作

  20. 20

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

  21. 21

    リストビューを使用したJqueryMobileの奇妙な動作

  22. 22

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

  23. 23

    奇妙なbashスクリプトの動作

  24. 24

    奇妙なJQueryスクリプトの動作

  25. 25

    リストを使用したEntityFrameworkの奇妙な動作

  26. 26

    Bash ログオン スクリプトの奇妙な動作

  27. 27

    iOS javascriptPOSTリクエストの奇妙な動作

  28. 28

    奇妙なPythonデストラクタの動作

  29. 29

    Python: locals() の奇妙な動作

ホットタグ

アーカイブ