【问题标题】:a misunderstanding about lists and multiple iterations对列表和多次迭代的误解
【发布时间】:2020-03-05 23:55:06
【问题描述】:

我在高中学习 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。

【问题讨论】:

标签: python list for-loop append tuples


【解决方案1】:

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

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

你的代码目前在做什么?

  • 您创建了两个列表,x 和 y。
  • 然后循环 4 次,然后
    • 在x 的列表中添加一个零
    • 将列表x 附加到列表L

因此,您拥有相同的列表 x,其中四个零在列表 L 中出现了四次

你真正希望你的代码做什么

  • 您创建了两个列表,x 和 y。
  • 然后循环 4 次,然后
    • 在x 的列表中添加一个零
    • 将列表x的副本附加到列表L

你的代码应该是什么样子

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

  • slicing:
    >>> x = [1,2,3]
    >>> y = x[:]
    >>> x.append(4)
    >>> y
    [1, 2, 3]
    
  • 使用 copy method of any mutable sequence type(仅限 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]]

【讨论】:

  • 非常感谢您的详细回复!所以你是说当我第二次将0附加到“a”时,在第一次迭代期间已经附加到“L”的“a”列表也会改变?因为这样才有意义
  • 是的,这就是我要说的。循环之后,您只有两个列表。一个有四个零,一个包含另一个列表四次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 2012-10-11
  • 2013-03-10
相关资源
最近更新 更多