0

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

为什么?

4

1 回答 1

6

a并且b不要引用,它们三个都引用一个对象c10

这意味着执行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 :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]]

请注意,如果您更改 的绑定m则不会更改 中的实际绑定list2

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

当你这样做时,你最终得到:

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