我正在学习列表理解,我通过切换变量得到了两个不同的结果,尽管它们看起来应该是一样的。你知道吗
数组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先到很重要吗?你知道吗
这里重要的不是变量的顺序。事实上,运行列表理解1也不起作用,原因与列表理解2相同。我猜您之前在程序中已经定义了
i
,这就是为什么列表理解1对您有效的原因。问题是for
循环的顺序。你知道吗我将试着举例说明。如果你这样写,它会运行良好:
注意我添加的方括号。在这种情况下,首先发生
for
循环和i
,然后才发生for
循环和j
。(但是,应该注意,这将返回一个元组列表。)或者,这也可以正常运行:当两个
for
循环以这种方式写在一起时(这次没有额外的括号),它们是从左到右读取的。你知道吗当您在单个列表中有一个双
for
循环时,它相当于使用“传统的”for
循环以相同的顺序执行这些for
循环。所以呢几乎完全等同于
如您所见,当您执行
len(a[j])
时,变量j
不存在,这就是为什么会得到NameError
。你知道吗顺便说一句,你的第一张单子也不管用。我怀疑您在代码的前面已经定义了
i
,这就是为什么您没有得到NameError
。下面是list comp的一个稍微改进的版本,它假设a
是一个矩阵,即它的所有子列表长度相同,并且至少包含一个子列表。你知道吗我们也可以这样做
两个列表组件都创建此列表:
相关问题 更多 >
编程相关推荐