一尘不染

Python:清单清单

python

运行代码

listoflists = []
list = []
for i in range(0,10):
    list.append(i)
    if len(list)>3:
        list.remove(list[0])
        listoflists.append((list, list[0]))
print listoflists

退货

[([7, 8, 9], 0), ([7, 8, 9], 0), ([7, 8, 9], 0), ([7, 8, 9], 1), ([7, 8, 9], 2), ([7, 8, 9], 3), ([7, 8, 9], 4), ([7, 8, 9], 5), ([7, 8, 9], 6), ([7, 8, 9], 7)]

因此,每次在列表列表中每次更新元组(列表)的第一个参数,但第二个参数list [0]却没有更新。有人可以解释这里发生的事情并提出解决方法吗?我想输出

[([0],0), ([0,1],0), ...

阅读 165

收藏
2020-12-20

共1个答案

一尘不染

列表是可变类型-为了创建副本(而不只是传递相同的列表),您需要明确地这样做:

listoflists.append((list[:], list[0]))

但是,list已经是Python内置的名称-最好不要将该名称用作变量。这是一个不用list作变量名并复制的版本:

listoflists = []
a_list = []
for i in range(0,10):
    a_list.append(i)
    if len(a_list)>3:
        a_list.remove(a_list[0])
        listoflists.append((list(a_list), a_list[0]))
print listoflists

请注意,我演示了两种不同的方法来复制上面的列表:[:]list()

首先[:]是创建一个 切片 (通常通常用于获取列表的一部分),该 切片 恰好包含整个列表,因此实际上是列表的副本。

第二个list()使用实际的list 类型构造函数
创建一个新列表,该列表的内容等于第一个列表。(在第一个示例中我没有使用它,因为您在代码中覆盖了该名称-这是为什么您不想这样做的一个很好的例子!)

2020-12-20