Python - 为什么我们必须在while循环中初始化标识符而不是在for循环中?

时间:2016-01-24 13:36:15

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

之前我学习过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代码的案例研究。我想要的是对Python结构本身以及执行for loopwhile loop时语言的一些基础操作的更一般性解释。此外,在这种情况下,我指的是Python 2.7.11。如果你能指出3.5.1的结构差异,我将非常感激。非常感谢。

3 个答案:

答案 0 :(得分:4)

__init__

如果您对x = 1 while True: print "To infinity and beyond! We're getting close, on %d now!" % (x) x += 1 发表评论,则此行会引发错误:

x = 1

因为它意味着x += 1 ,因为没有定义x,它会引发一个错误(python不知道什么值加1)

x = x + 1

你在两个变量中使用相同的名称,在循环内部和外部,这就是为什么你在循环中有另一个值num = 10 for num in range(5): print num print num 的原因。

好的做法是在循环变量中有变量的另一个名称,因为你真的不需要为循环变量设置相同的变量,就像你在循环外面一样

所以,你可以这样写:

num

答案 1 :(得分:1)

因为'range'表示你继承了什么值并将num定义为本地值。你看几句话但是有一个更复杂的过程。

一个例子可能是Javascript语言。在for循环中,您可以看到循环迭代的值的初始值,您可以看到最大值和增量。 for(var num = 0; var< 5; var + = 1)在python中你看到num在范围(5)中。 while循环更明确。

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

答案 2 :(得分:1)

因为Python的for循环更像是C#' foreach或JS' for of, 而VB' for更像是帕斯卡尔for

我会使用Pascal而不是VB,因为我知道它更好。

Pascal' for

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

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

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

但是,Python for更多的是:

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

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

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