说
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
10
这意味着执行c = 123
不会改变后面 c
的对象,它会简单地指向c
一个新对象123
,离开a
并且b
独自一人。
换句话说,您最初是:
a ---+
|
b ---+---> 10-object
|
c ---+
并执行c = 123
以下更改:
a ---+
|
b ---+---> 10-object
c -------> 123-object
您越早掌握 Python 确实是完全面向对象的,您就会越快掌握该语言 :-)
您的第二个示例更改所有元素的l
原因是因为l
列表中的所有项目都引用了单个list1
而不是不同的支持对象:
l -------> list2 {list1, list1, list1}
m -------> list1 {0-object}
Executingl[0][0] = 1
与execution 相同m[0] = 1
(见下文),它不会更改对其列表的绑定,或将这些项目与to的绑定,而只是将其中的项目更改为a :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}