嵌套for循环(在本例中为double for循环)如何在创建2D列表时起作用 .
例如,我希望有一个2x2矩阵,每个元素初始化为0 .
我懂了:
x = [[0 for i in range(row)] for j in range(col)]
其中row被定义为矩阵中的行数,col被定义为矩阵中的列数 . 在这种情况下,row = 2和col = 2 .
当我们打印x:
print(x)
我们将得到:
[[0, 0], [0, 0]]
这就是我们想要的 .
这背后的逻辑是什么?是 [0 for i in range(row)]
说,对于指定行号范围内的每个元素,我们将分配一个0来有效地创建矩阵中的第一行吗?
然后 for j in range(col)
说我们根据指定的列号重复创建这个列表,以有效地创建更多的行,最终成为列?
我该如何从左到右阅读此代码段?
3 回答
这只是一个捷径:
你可以把内部
for
循环写成一个,说该列表由一大堆0
组成 . 我们为range(row)
中的每个i
执行此操作,因此我们可以说_ = [0 for i in range(row)]
. 这是看起来如何:我们现在可以看到
x
由一堆[0 for i in range(row)]
组成,我们为range(column)
中的每个j
做了一次,所以我们可以将它简化为:有时扩展所有单线速记代码可以帮助您更好地理解:
基本
可以扩展为:
更多嵌套
可以扩展为:
关于这段代码如何工作的假设是正确的:内部列表理解创建了一个零列表,外部列表理解创建了这样的列表列表 . 然后,您只需将列表解释为列,将每个列表中某个位置的零解释为行 . (没有涉及矩阵的数学概念,因此没有将行转换为列;它只是列表列表 . )
用于创建零和列表的代码实际上被执行多次,从而产生不同的列表(即,您可以修改其中一个而不修改其他列表) . 我正在强调这一点,因为你是Python新手,所以注意对象身份和对象平等之类的东西是很重要的 . 例如,零列表可以这样做:
这样就行了,因为列表保存了对整数
0
的引用,修改列表会替换一些引用并保留其他引用 . 另一方面,以下代码会做出与您不同的代码:结果看起来与你的第一眼看上去相同,但是外部列表现在会对同一个零列表进行多次引用,因此修改一列也会修改其他列(因为所有列现在都是相同的列表,不是明显的内容相同的清单) .
此外,它's interesting to consider the functional nature of list comprehensions. You'重新询问如何阅读代码:只是阅读它'd read it out aloud. What I'我得到的是这个代码不是程序性的,它没有规定机器应该如何创建空列表并向它们添加元素 . 它改为描述结果应该是什么:列表中每个位置的零列表,它们的编号为
row
,以及另一个列表中每个位置的此类列表的列表,它们的编号依次为col
.