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

2024-09-28 16:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,从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中的标识符赋值

^{pr2}$

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

我知道这里有很多for loopwhile loop问题,但大部分都是OP代码的案例研究。我想要的是对Python结构本身以及执行for loop或{}时该语言的一些底层操作的更一般的解释。另外,在本例中,我指的是Python2.7.11。如果您能指出3.5.1在结构上的差异,我将不胜感激。谢谢。在


Tags: andtolooptrue声明forwiki标识符
3条回答
x = 1
while True:
    print "To infinity and beyond! We're getting close, on %d now!" % (x)
    x += 1

如果您对x = 1进行注释,这一行将引发一个错误:

^{pr2}$

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

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

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

好的做法是在循环变量内为变量取另一个名称,因为实际上不需要像在循环外那样使用相同的for loop变量

你可以这样写:

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

因为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中轻松复制:

^{pr2}$

但是,Python的for还有更多:

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

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

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

因为'range'告诉您什么是连续的值,并将num定义为局部值。你看不到几个字,但有一个更复杂的过程。在

例如Javascript语言。在for循环中,可以看到循环中迭代的值的初始值,可以看到最大值和增量。对于(var num=0;var<;5;var+=1),在python中可以看到num在范围(5)内。while循环更显式。在

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

相关问题 更多 >