首页 > 解决方案 > 对列表和多次迭代的误解

问题描述

我在高中上 Python 编程课,我遇到了一些奇怪的事情。我认为这只是我的错误,但输入时我不知道为什么:

L = []
x = []
for i in range(4):  
    x.append(0)
    L.append(x)
print (L)

输出显示:

[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

而不是这个:

[[0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]

搜索了网格的制作方法后,我变得好奇,我的项目是一个粗糙的战舰游戏,我必须用网格制作

我认为附加的第一个列表中只有一个对象是合乎逻辑的,因为它是第一次迭代,因此“x”的长度将等于 1 而不是 4。

标签: pythonlistfor-loopappendtuples

解决方案


我认为附加的第一个列表中只有一个对象是合乎逻辑的,因为它是第一次迭代,因此“x”的长度将等于 1 而不是 4。

附加的第一个列表中只有一个0。但它与您.append(0)在循环的下一次迭代中调用的列表相同。

您的代码目前在做什么?

  • 您创建两个列表,x并且y.
  • 然后你循环4次
    • 将零添加到列表中x
    • 将列表附加x到列表L

结果,您在列表中x有四次四个零的相同列表L

你真正想要你的代码做什么

  • 您创建两个列表,x并且y.
  • 然后你循环4次
    • 将零添加到列表中x
    • 将列表的副本附加x到列表L

你的代码应该是什么样子

在 Python 中有几种方法可以复制列表:

  • 切片: _
    >>> x = [1,2,3]
    >>> y = x[:]
    >>> x.append(4)
    >>> y
    [1, 2, 3]
    
  • 使用copy任何可变序列类型的方法(仅限 Python3):
    >>> x = [1,2,3]
    >>> y = x.copy()
    >>> x.append(4)
    >>> y
    [1, 2, 3]
    
  • 使用list()构造函数:
    >>> x = [1,2,3]
    >>> y = list(x)
    >>> x.append(4)
    >>> y
    [1, 2, 3]
    

所以你的代码可能看起来像:

x = []
L = []

for _ in range(4):
    x.append(0)
    L.append(x[:])

print(L)

输出:

[[0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]


推荐阅读