Python:列表列表

2024-04-23 17:06:27 发布

您现在位置: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)的第一个参数每次都在列表中更新,但是第二个参数list[0]没有更新。有人能解释一下这是怎么回事并提出解决办法吗?我想输出

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

Tags: 代码in列表for参数lenifrange
3条回答

首先,我强烈建议您将变量list重命名为其他变量。list是内置列表构造函数的名称,您正在隐藏其正常函数。我将在下面将list重命名为a

Python名称是绑定到对象的引用。这意味着,除非您创建多个列表,否则每当您使用a时,它引用的实际列表对象与上次相同。所以当你打电话

listoflists.append((a, a[0]))

您可以稍后更改a,它将更改元组的第一个元素指向的内容。这不会在a[0]中发生,因为a[0]指向的对象(它是一个整数)不会更改(尽管a[0]在代码运行期间指向不同的对象)。

您可以使用list构造函数创建整个列表的副本:

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

或者,您可以使用切片符号进行复制:

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

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

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

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

列表是一种可变类型-为了创建副本(而不仅仅是传递相同的列表),您需要显式地执行以下操作:

    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类型构造函数创建一个新列表,其中的内容与第一个列表相等。(我没有在第一个示例中使用它,因为您在代码中重写了该名称—这是一个很好的示例,说明了为什么您不想这样做!)

相关问题 更多 >