将列表添加到空的 python 列表问题

Posted

技术标签:

【中文标题】将列表添加到空的 python 列表问题【英文标题】:Adding a list to an empty python list issue 【发布时间】:2014-05-22 15:09:18 【问题描述】:

我是 Python 初学者,没有任何编程经验。 如果这个问题听起来太蹩脚而无法回答,我提前道歉,但有些事情我很困惑。它与将特定列表 (l2) 添加到空列表 (l1) 相关。 我要做的是在每次迭代中增加每个“l2”元素的值,然后将其添加到l2列表中。代码如下:

l1 = []
l2 = [0,1,2,3]

for i in range(3):
    l2[0] = l2[0] + 1
    l2[1] = l2[1] + 1
    l2[2] = l2[2] + 1
    l2[3] = l2[3] + 1
    print l2
    l1.append(l2)

print l1

这是我得到的打印结果:

[1, 2, 3, 4]
[2, 3, 4, 5]
[3, 4, 5, 6]
[[3, 4, 5, 6], [3, 4, 5, 6], [3, 4, 5, 6]]

为什么 l2 列表不是这样的:

[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

? 谢谢你的回复。

【问题讨论】:

【参考方案1】:

这是因为您每次都附加相同的列表对象。您需要先复制列表对象,然后再追加它,以确保追加不同的对象。

l1.append(l2[:])

【讨论】:

【参考方案2】:

那是因为当您将l2 附加到l1 时,您实际上保留了对同一列表的引用。因此,当您修改l2 时,该实例与附加到l1 的实例相同,因此也会被修改。你应该这样做:

for i in range(3):
    l2[0] = l2[0] + 1
    l2[1] = l2[1] + 1
    l2[2] = l2[2] + 1
    l2[3] = l2[3] + 1
    print l2
    l1.append(l2[:])

>>> print l1
[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

说明

这里[:]被称为列表拼接。它遵循以下格式:[a:b] 其中a 是列表的开始索引,b 是字符串的结束索引(排除)。在不指定任何参数的情况下,[:] 实质上会创建列表的副本并附加 copy

示例

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> print a[2]
c

>>> print a[:]
['a', 'b', 'c', 'd', 'e']

>>> print a[2:4]
['c', 'd']

>>> print a[:3]
['a', 'b', 'c']

>>> print a[1:]
['b', 'c', 'd', 'e']

【讨论】:

感谢您的即时回复 sshashank。但我不确定我是否理解。那么为什么“print l2”会显示正确的“结果”呢? “print l2”中的“l2”和“l1.append(l2)”中的“l2”有区别吗? @user3137724,因为你马上就在做print l2。然而,你不断地追加这些值,同时还改变了以前的值并在最后打印出来。 @user3137724,从某种意义上说,您是在附加您稍后要更改的相同对象。您要做的是到目前为止创建对象的副本,然后附加 that 以便将来对原始 l2 进行更改时,l1 中存在的副本会 受到影响。绕一个人的脑袋确实需要一段时间。希望这很清楚。祝你好运【参考方案3】:

因为您添加的是列表 l2 本身,而不是它的副本。这就是为什么在打印循环结束时,您会得到一个包含最后 l2 值的列表。

您可以使用下面的这个技巧来创建 l2 的副本,然后将其添加到 l1:

l1.append(l2[:])

【讨论】:

以上是关于将列表添加到空的 python 列表问题的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Flutter 中的 Firebase Firestore 返回列表

如何在for循环中将数据附加到空列表?

删除空的嵌套列表 - Python

如何在循环中将不同大小的列表附加到空熊猫数据框的每一列?

空数组到空列表

数据绑定 recyclerview 适配器从 livedata 接收到空列表