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

所以不知何故,每个元组(列表)的第一个参数每次都会在列表列表中更新,但第二个参数列表 [0] 不会。有人可以解释这里发生了什么并提出解决此问题的方法吗?我想输出

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

原文由 Carl 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 218
2 个回答

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

 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 类型构造函数 来创建内容与第一个列表相同的新列表。 (我没有在第一个例子中使用它,因为你在你的代码中覆盖了那个名字——这是一个很好的例子,说明为什么你不想那样做!)

原文由 Amber 发布,翻译遵循 CC BY-SA 4.0 许可协议

我来这里是因为我是 python 的新手而且很懒惰,所以我正在搜索一个例子来创建一个包含 2 个列表的列表,过了一会儿我意识到这里的主题可能是错误的……这是一个创建列表列表的代码:

 listoflists = []
for i in range(0,2):
    sublist = []
    for j in range(0,10)
        sublist.append((i,j))
    listoflists.append(sublist)
print listoflists

这是输出:

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

你的代码的问题似乎是你正在用你的列表创建一个元组并且你得到了对列表的引用而不是副本。我想应该属于元组主题……

原文由 user110954 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏