python - 为什么 "j"能够识别范围变化,而 "i"却不能?

标签 python for-loop range

我正在编写一些代码,其中的情况与下面提供的代码类似。看来在第二个for循环中,num的值的变化正在被识别,而第一个for循环的值中却没有。为什么不呢?我该如何以它能识别的方式写这个呢?

num=3
for i in range(num):
    for j in range(num):
        print(i, j)
        if num<5:
            num=num+1

代码按照我预期的 (0, 0)、(0, 1) 等开始,但以 (2, 4) 结束,因为 j 已到达其范围的末尾。我不明白为什么第一个 for 循环不知道 num 已更新。

最佳答案

看来您希望 for 循环表现得像 while 循环。

让我们写一个稍微简单一点的例子来看看发生了什么。

num = 5
for j in range(num):
    print(j)
    if j == 3:
        num = num + 1

输出

0
1
2
3
4
  <--- No 5

您似乎期望上述行为与以下代码片段等效。

num = 5
j = 0
while j < num:
    print(j)
    if j == 3:
        num += 1
    j += 1

输出

0
1
2
3
4
5  <-- updating num added a value in the output

for 循环与 while 循环

for 循环和 while 循环之间的根本区别在于,while 循环只要条件为真就会运行,并且在每次迭代时重新评估条件。同时,for 循环遍历可迭代对象中的项目(在这种情况下是一个范围),可迭代不会在每次操作时重新评估

范围对象

让我们看另一个示例,它解释了为什么当 num 递增时,可迭代的 range(num) 没有更新。

num = 5
r = range(num)
print(r) # range(0, 5)

num += 1
print(r) # still range(0, 5)

当调用range(num)时,会创建一个可迭代对象。它接收值 5 作为上限,并且根本不关心名称 num。正如您所看到的,当 num 更新时,对象 r 不受影响。为什么会这样?它被赋予了值5,这就是它所关心的一切。

返回您的代码

如果 for 循环的可迭代没有重新计算,为什么内循环并不总是相同?

嗯,正是因为内循环在每次迭代时运行。在外循环的每次迭代中,都会为内循环创建一个新对象 range(num),并且由于 num 已更新,因此新创建的 范围与初始范围不同。

关于python - 为什么 "j"能够识别范围变化,而 "i"却不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55926243/

相关文章:

python - 任何用于计数器的漂亮 python 字符串格式?

javascript - Python/JavaScript - WebSockets 连接问题

python - 从数据库查看我的数据时出错

python - 从数组中取出一个范围

javascript - 尝试检查表单中的值是否在设定范围内的数字

尝试使用 pip 安装 'request' 包时出现 Python 错误

For 循环内 If 语句的 JavaScript 正确语法

Java - For 循环将无法完成,仅三个循环后就会崩溃

javascript - For 循环和 getElementById

javascript - 延迟加载:How to display multiple pdf documents as one with pdf.js?