为什么这个列表克隆结果很奇怪(python 3.3)

时间:2013-12-11 10:25:03

标签: python python-3.3

很抱歉,问这个'愚蠢的'问题,但是我在过去几个小时内已经解决了这个问题。我已经编写了很长一段时间的python,并且从来没有遇到过这种问题,但是我的笔记本电脑被盗了,所以我在另一台计算机上安装了python 3.3。今天我尝试用列表克隆做一些事情,我不断遇到问题,所以最后我尝试了这个:

a = [[0, 1, 2],[-1, 0, 1],[-2, -1, 0]]
m = a[:]
m[1][1] = 'x'
print(m,a)

结果是:

[[0, 1, 2], [-1, 'x', 1], [-2, -1, 0]]  [[0, 1, 2], [-1, 'x', 1], [-2, -1, 0]]

怎么来的??? m应该是a的副本。我尝试了id(a)id(m),但他们都显示了不同的结果。但它仍然是这样的结果。我的编译器可能有问题吗?请指教。

P.S。在发布此问题之前,我已阅读过所提及的帖子。我知道如何复制/克隆列表。直到今天,通常我都没有遇到任何问题。也许为了澄清我的问题,它不是如何纠正它(因为我已经解决它以获得正确的结果),但为什么代码表现得像理论上m = a [:]会导致与a具有相同值的新列表,而不仅仅是将相同的列表引用为。

P.P.S。对不起,我再次阅读了上面提到的帖子,我在那里找到了答案:[:]不适用于嵌套列表。我没有完全理解/理解术语“嵌套列表”#39;在第一时间阅读(英语不是我的母语)。案件结案。感谢。

1 个答案:

答案 0 :(得分:1)

编译器是对的。

如果您选中id(m[1])id(a[1]),您可能会发现它们引用同一个对象。

我认为原因是列表am只存储对其他对象的引用,类似C++中的指针。

当我们考虑使用list复制slicing时,我应该说这是一个值得注意的案例。非常好的例子!