【问题标题】:Python - Why do we have to initialise the identifier in while loop but not in for loop?Python - 为什么我们必须在 while 循环中初始化标识符而不是在 for 循环中?
【发布时间】:2016-01-24 13:36:15
【问题描述】:

我之前学习过 Visual Basic,现在我正在学习 Python。我意识到在 Python 中,我们不必为for loop 中的标识符初始化一个值,但在while loop 中则相反。在 Visual Basic 中对我来说似乎很陌生,我们必须在两个循环中声明一个变量作为标识符。

例如,来自 Python wiki,

x = 1
while True:
    print "To infinity and beyond! We're getting close, on %d now!" % (x)
    x += 1

完美运行。但是,在我评论x = 1 后,它会产生错误。为什么它不能像for loop 那样运行,x 从 0 开始?

另外,即使我们为for loop中的标识符赋值,例如,

num = 10
for num in range(5):
    print num
print num

循环将覆盖赋值的值。为什么会这样?

我知道这里有很多 for loopwhile loop 问题,但大多数都是 OP 代码的案例研究。我想要的是在执行for loopwhile loop 时对Python 结构本身和语言的一些底层操作进行更一般的解释。另外,在这种情况下,我指的是 Python 2.7.11。如果您能指出 3.5.1 在结构方面的差异,我将不胜感激。非常感谢。

【问题讨论】:

  • 我真的不知道你期待什么样的答案。您似乎已经知道 while 和 for 循环是如何工作的。对变量赋值的理解是这里的问题吗?
  • 在 python 中,如果不先为其赋值,就不能使用变量。因此,当您不设置 x = 1 时,python 将不知道 x 是什么。在for 循环中,num 用作迭代器,因此此命令将其值设置为每个循环传递中列表中的每个值,range(5) 生成从 0 到 4 的整数值的列表(数组)
  • @timgeb 请参考我对pivanchy的回复。

标签: python python-2.7 loops for-loop while-loop


【解决方案1】:
x = 1
while True:
    print "To infinity and beyond! We're getting close, on %d now!" % (x)
    x += 1

如果您评论x = 1,此行会引发错误:

x += 1

因为它的意思是,x = x + 1,因为 x 没有定义,所以会引发错误(python 不知道加 1 的值是什么)

num = 10
for num in range(5):
    print num
print num

您在循环内部和外部对两个变量使用相同的名称,这就是为什么您在循环中有另一个值 num

良好的做法是在循环变量中为变量使用另一个名称,因为您确实不需要像在循环外部那样使用相同的 for 循环变量

所以,你可以这样写:

num = 10
for i in range(5):
    # play with num and i variables
    num += i * 2
 print num

【讨论】:

  • 通过使用名称 iter,您将掩盖内置函数 iter,因此对于您的示例来说,这可能不是一个很好的名称。
  • @timgeb,是的,你是对的。使用这个例子,我想展示如何在循环内和循环外使用变量的想法。但是你的评论很有道理。谢谢,我改名了
  • @Caesium95 好吧,当您使用 for 循环 for x in foo 时,您定义了 x 应该是什么。在第一个循环中,x 将是迭代器产生的第一个值,在第二个循环中它将是迭代器的第二个值,依此类推。当您发出while x < 5 时,如果没有事先定义,Python 应该如何知道x 应该是什么?它拒绝在这里猜测的诱惑,会抛出错误。
  • @Caesium95,所以...当您编写类似 for x in range(5): ... 的内容时,这意味着 x - 是您的可迭代变量,名称为 x,并且在 for loop 的每一步之后有另一个值 (0, 1, 2, 3, 4) 。当你写这个时:while x<5:.. 这意味着你不是在循环中迭代,而是只检查 x 变量的值(虽然不是迭代器,它只是检查条件)
  • @Caesium95,如果您在循环之前定义了一个变量,并且在循环内定义了相同的变量,您将覆盖该变量,并且在循环之后该变量的值将是相同的,如这是循环的最后一步。例如,i = 15; for i in range(10): print(i); 这里的输出将是下一个:0 1 2 3 4 5 6 7 8 9。如果您尝试在循环后打印i 变量,则该值将是9,就像在循环的最后一步中一样:print(i) 打印9
【解决方案2】:

因为 Python 的 for 循环更像 C# 的 foreach 或 JS 的 for of
而VB的for更像是Pascal的for

我将使用 Pascal 而不是 VB,因为我更了解它。

帕斯卡的for

var i: byte;
begin
    for i := 0 to 5 do
    begin
        writeln(i);
    end;
end.

每个 Pascal 的 for 循环都可以使用 range 在 Python 中轻松复制:

for i in range(5):
    print(i)

但是,Python 的 for 更多:

for c in "HelloWorld!":
    print(c)

如果不直接处理索引,就无法在 Pascal 中复制它。

Pascal 和 VB 的 for 使用索引 - 它们从某个索引迭代到另一个索引,而 Python 的 for 循环使用可迭代对象(数组、字符串、文件、生成器等等)。

【讨论】:

    【解决方案3】:

    因为“范围”告诉您什么是值的连续性,并将 num 定义为局部值。您看到的单词很少,但有一个更复杂的过程。

    一个例子可能是 Javascript 语言。在 for 循环中,您会看到循环中迭代的值的初始值,您会看到最大值和增量。 for(var num = 0; var

    num 是用于全局变量和局部变量的名称这一事实可能会引起混淆。实际上,您在循环中看到的 num 是另一个变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2011-04-21
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      相关资源
      最近更新 更多