将列表添加到空的 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 列表问题的主要内容,如果未能解决你的问题,请参考以下文章