言う
c = 10
a = b = c
と今a,b
参考にしているので、変われc
ばそうなるだろうと思っていたので、c
a,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
なんで?
言う
c = 10
a = b = c
と今a,b
参考にしているので、変われc
ばそうなるだろうと思っていたので、c
a,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
なんで?
a
および参照b
しない場合c
、これら 3 つすべてがオブジェクトを参照します10
。
つまり、実行してもオブジェクトの背後c = 123
にあるものは変更されず、単に新しいオブジェクトを指し、離れてそのままになることを意味します。 c
c
123
a
b
言い換えれば、あなたは元々以下を持っています:
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
(以下を参照)。リストへの のバインディング、または 内のアイテムのバインディングは変更されませんが、単に内のアイテムが に変更されます。m
list2
list1
list2
1-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]]
のバインディングを変更しても、 の実際のバインディングは変更されないことに注意してください。m
list2
>>> m = [999]
>>> l
[[42], [42], [42]]
それを行うと、次のようになります。
l -------> list2 {list1, list1, list1}
list1 {42-object}
m -------> list3 {999-object}