首页 > 解决方案 > 为什么我的列表中会发生这种奇怪的事情?

问题描述

我有一个列表,我想在我的列表中反向遍历并用前一个元素更改每个元素,直到第一个元素:

lst = [[1,2], [1,3], [1,4], [2,4]]
for i in range(len(lst) - 1, 0, -1):
    lst[i] = lst[i-1]

lst[0][0] += 1

之后,这是我期望的结果:

>>> lst
[[2, 2], [1, 2], [1, 3], [1, 4]]

但结果是这样的:

>>> lst
[[2, 2], [2, 2], [1, 3], [1, 4]]

当您将它们分配给彼此时,我听说过有关在 2 个列表之间进行引用的信息,但问题是为什么其他元素不会发生此结果,例如:

lst = [[1,2], [1,3], [1,4], [2,4]]
for i in range(len(lst) - 1, 0, -1):
    lst[i] = lst[i-1]

lst[2][0] += 1

这是结果:

>>> lst
[[1, 2], [1, 2], [2, 3], [1, 4]]

我的期望:

>>> lst
[[1, 2], [1, 2], [2, 3], [2, 4]]

lst[2]为什么and之间没有任何引用lst[3]

标签: pythonlist

解决方案


让我们给您的子列表单独命名,因此您的列表最初是

lst = [a, b, c, d]

现在你执行这个循环:

for i in range(len(lst) - 1, 0, -1):
    lst[i] = lst[i-1]

在每一步,这就是你得到的:

# lst[3] = lst[2]
[a, b, c, c]
# lst[2] = lst[1]
[a, b, b, c]
# lst[1] = lst[0]
[a, a, b, c]

现在你最终得到lst[0]lst[1]成为同一个对象,所以当你在内部进行更改时,lst[0]你会看到相同的更改lst[1]


推荐阅读