0

言う

c = 10
a = b = c

と今a,b参考にしているので、変われcばそうなるだろうと思っていたので、ca,b

c = 123  # change c, then a = b = 123

でも実はa,b全然変わらないのはなぜ?リストを考えてみましょう

m = [0]
l = [m]*3
l[0][0] = 1  # just change l[0][0], then l[1:] change

なんで?

4

1 に答える 1

6

aおよび参照bない場合c、これら 3 つすべてがオブジェクトを参照します10

つまり、実行してもオブジェクトの背後c = 123にあるものは変更されず、単に新しいオブジェクトを指し、離れてそのままになることを意味します。 cc123ab

言い換えれば、あなたは元々以下を持っています:

a ---+
     |
b ---+---> 10-object
     |
c ---+

c = 123変更を実行すると、次のようになります。

a ---+
     |
b ---+---> 10-object

c -------> 123-object

Pythonが本当に完全なオブジェクト指向であることを理解するのが早ければ早いほど、言語を理解するのも早くなります :-)

2 番目のサンプルが のすべての要素を変更する理由lは、リスト内のすべての項目が個別のバッキング オブジェクトではなくl単一のバッキング オブジェクトを参照するためです。list1

l -------> list2 {list1, list1, list1}
m -------> list1 {0-object}

実行l[0][0] = 1は実行と同じですm[0] = 1(以下を参照)。リストへの のバインディング、または 内のアイテムのバインディングは変更されませんが、単にのアイテムが に変更されます。mlist2list1 list21-object

l -------> list2 {list1, list1, list1}
m -------> list1 {1-object}

list1したがって、 の内容の変更がすべてに影響することがわかります。l[0][0]とが同等であることを示すトランスクリプトをm[0]以下に示します。

>>> m = [0]
>>> l = [m] * 3
>>> m
[0]

>>> l
[[0], [0], [0]]

>>> l[0][0] = 1
>>> l
[[1], [1], [1]]

>>> m
[1]

>>> m[0] = 42
>>> l
[[42], [42], [42]]

のバインディングを変更しても、 の実際のバインディングは変更されないことに注意してください。mlist2

>>> m = [999]
>>> l
[[42], [42], [42]]

それを行うと、次のようになります。

l -------> list2 {list1, list1, list1}
           list1 {42-object}
m -------> list3 {999-object}
于 2013-07-31T01:29:54.023 に答える