对列表中的语句重新排序时出现名称错误

2024-04-24 22:16:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习列表理解,我通过切换变量得到了两个不同的结果,尽管它们看起来应该是一样的。你知道吗

数组a等于[[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

清单1工程:

[(i,j) for j in range(len(a[i])) for i in range(len(a))] 

退货:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]

一如预期。你知道吗

但是翻转变量。。。你知道吗

[(j,i) for i in range(len(a[j])) for j in range(len(a))]

结果是名称错误:名称“j”未定义

有人能给我解释一下为什么我和j先到很重要吗?你知道吗


Tags: in名称列表forlen错误range数组
2条回答

这里重要的不是变量的顺序。事实上,运行列表理解1也不起作用,原因与列表理解2相同。我猜您之前在程序中已经定义了i,这就是为什么列表理解1对您有效的原因。问题是for循环的顺序。你知道吗

我将试着举例说明。如果你这样写,它会运行良好:

[ [(i,j) for j in range(len(a[i]))] for i in range(len(a))] 

注意我添加的方括号。在这种情况下,首先发生for循环和i,然后才发生for循环和j。(但是,应该注意,这将返回一个元组列表。)或者,这也可以正常运行:

[(i,j) for i in range(len(a)) for j in range(len(a[i]))] 

当两个for循环以这种方式写在一起时(这次没有额外的括号),它们是从左到右读取的。你知道吗

当您在单个列表中有一个双for循环时,它相当于使用“传统的”for循环以相同的顺序执行这些for循环。所以呢

result = [(j,i) for i in range(len(a[j])) for j in range(len(a))]

几乎完全等同于

result = []
for i in range(len(a[j])):
    for j in range(len(a)):
        result.append((j, i))

如您所见,当您执行len(a[j])时,变量j不存在,这就是为什么会得到NameError。你知道吗

顺便说一句,你的第一张单子也不管用。我怀疑您在代码的前面已经定义了i,这就是为什么您没有得到NameError。下面是list comp的一个稍微改进的版本,它假设a是一个矩阵,即它的所有子列表长度相同,并且至少包含一个子列表。你知道吗

[(i,j) for j in range(len(a[0])) for i in range(len(a))]

我们也可以这样做

[(j, i) for i in range(len(a)) for j in range(len(a[0]))]

两个列表组件都创建此列表:

[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (0, 4), (1, 4), (2, 4), (3, 4), (4, 4)]

相关问题 更多 >