为什么list.append()在这个代码中写数据

2024-05-19 14:14:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一些列表附加到for循环中的另一个列表中,但append方法似乎正在覆盖列表的先前数据

listFil1 = ["R1000", "D940", "L143", "D182", ...]

position1 = [0,0]

position1list = []

for i in range(0, len(listFil1)):
    #Get the move from each list
    move1 = listFil1[i]

    #evaluate position1
    if move1[0] == "R":
        position1[1] += int(move1[1:])
    elif move1[0] == "L":
        position1[1] -= int(move1[1:])
    elif move1[0] == "U":
        position1[0] += int(move1[1:])
    elif move1[0] == "D":
        position1[0] -= int(move1[1:])

    #Append each move, this is where the problem is
    position1list.append(position1)

如果我在for循环中打印position1,我会得到每个迭代的预期结果: * [0, 1000] * [-940, 1000] * [-940, 857] * [-1122, 857] * [-1122, -20] * [-1831, -20] * [-1831, -273] * [-1583, -273] * [-1583, -574] * [-1149, -574] * [-1149, 267] * [-434, 267] * [-434, 968] * ... * [-1966, -12739] *[-1966,-13333年]

但是,当我在for循环之外的末尾打印position1list时,我得到了正确长度的数据,但是列表中的每一项都等于最后一个位置1: [[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、[-1966,-13333]、…]

代码的哪一部分使append覆盖整个列表? 我可以改变什么来得到最后所有职位的列表


Tags: the数据方法列表formoveisint
3条回答

在所有迭代中都使用相同的position1对象,然后在position1list中对同一列表进行多个引用。您需要在每次迭代中重新声明您的列表以创建一个唯一的对象


您的问题的简单演示如下:

>>> l = []
>>> a = [l, l]
>>> a
[[], []]
>>> l.append(1)
>>> a
[[1], [1]]

如您所见,因为我们多次创建了一个带有l的列表,所以添加到l会更改整个a列表

这是因为变量position1不直接包含数组,而是包含对数组的引用。这意味着,如果将数组赋给另一个变量,并且修改其中一个变量,则这两个变量都将被修改

示例:

>>> a = [1,2]
>>> b = a
>>> a
[1, 2]
>>> b
[1, 2]
>>> b[0] = 0
>>> a
[0, 2]
>>> b
[0, 2]

因此,要处理此问题,您应该复制数组:

>>> a = [1,2]
>>> b = a.copy()
>>> b[0] = 0
>>> b
[0, 2]
>>> a
[1, 2]

您附加了相同的列表引用,因此它们都具有相同的元素。每次附加以下内容时,应制作一个浅拷贝:

position1list.append(position1.copy())

相关问题 更多 >