对列表和多次迭代的误解

问题描述 投票:0回答:1

[我正在读高中时,学习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。

list for-loop grid append tuples
1个回答
0
投票

我认为添加的第一个列表在逻辑上是合理的,因为它是第一次迭代,因此“ x”的长度等于1而不是4。

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

您的代码当前做什么?

  • 您创建两个列表,xy
  • 然后您循环播放4次,
    • 将零添加到x中的列表
    • 将列表x追加到列表L

结果,您拥有与列表x相同的列表L,其中四个零四次出现在列表x

您真正希望代码执行的操作

  • 您创建两个列表,yx
  • 然后您循环播放4次,
    • 将零添加到x中的列表
    • 将列表L
    • 追加副本到列表slicing

您的代码应如何显示

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

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

© www.soinside.com 2019 - 2024. All rights reserved.