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

时间:2014-04-09 12:11:56

标签: python list loops append range

我是Python初学者,没有任何编程经验。 如果这个问题听起来太蹩脚,我会提前道歉,但我有些困惑。它与将特定列表(l2)添加到空列表(l1)有关。 我想要做的是增加每个" l2"每次迭代中的元素,然后将其添加到l2 list.Here是代码:

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]]

? 谢谢你的回复。

3 个答案:

答案 0 :(得分:5)

这是因为您每次都附加相同的列表对象。您需要在附加列表对象之前复制它,以便确定附加了另一个对象。

l1.append(l2[:])

答案 1 :(得分:4)

这是因为当您将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是字符串的结束索引(排除)。如果不指定任何参数,[:]实际上会创建列表的副本并附加副本

实施例

>>> 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']

答案 2 :(得分:1)

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

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

l1.append(l2[:])
相关问题