我不明白python如何处理程序中具有相同名称的变量,尤其是在for
循环中。
以下是python程序
for i in range(10):
if i%2!=0:
print i
continue
i += 2
print i
结果如下
2
1
4
3
6
5
8
7
10
9
我不明白为什么我会得到上述结果。在我看来,当i
为0时,程序将执行i+=2
,因此i
变为2,并打印出来。然后for
完成一个循环,使i
增加1.因此,在第一个循环之后,i
应该变为3.我使用以下C ++程序测试我的意见,结果是正是我所期待的。
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int i;
for (i = 0; i < 10; ++i)
{
if(i%2!=0){
cout << i << endl;
continue;
}
i += 2;
cout << i << endl;
}
return 0;
}
结果如下:
2
3
6
7
10
为什么python程序的结果看起来像那样?
为了进一步利用这些原因,我在python程序中添加了更多print
个句子,如下所示:
for i in range(10):
print 'round ', i
if i%2!=0:
print 'in if, i = ',i
continue
print 'before i+=2, i is ',i
i += 2
print 'after i+=2, i is ',i
然后结果变成:
round 0
before i+=2, i is 0
after i+=2, i is 2
round 1
in if, i = 1
round 2
before i+=2, i is 2
after i+=2, i is 4
round 3
in if, i = 3
round 4
before i+=2, i is 4
after i+=2, i is 6
round 5
in if, i = 5
round 6
before i+=2, i is 6
after i+=2, i is 8
round 7
in if, i = 7
round 8
before i+=2, i is 8
after i+=2, i is 10
round 9
in if, i = 9
似乎python在程序的不同部分对待i
不同。它隐式声明了另一个名为i
的变量。但为什么? python的规则是什么决定是否隐式声明一个新变量?
答案 0 :(得分:3)
在循环中修改i
的方式无关紧要,下一次迭代将从range
对象中获取新值,并且i
的值将被覆盖。
所以Python循环
for i in range(10): ...
不 等同于C循环
for (i = 0; i < 10; i = i + 1) { ... }
使用i
的当前值来计算新值。相反,它更像是
for (i = 0; i < 10; i = get_next_value()) { ... }
其中get_next_value()
根本不考虑i
的当前值。
答案 1 :(得分:1)
Python只是从range(10)
生成的迭代中绘制元素,并将i
绑定到每个元素,就是这样。所以,Python正在做的是:
iterable = range(10)
try:
while True:
i = next(iterable) # this is important!
# this is your code
except StopIteration:
pass
如您所见,您可以按照您想要的方式修改i
,但在下一次迭代时它将被设置为next(iterable)
。
答案 2 :(得分:0)
这是在python(2.7)shell中运行range(10)
时得到的结果:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
因此,您的代码所做的与
相同for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]:
#the rest of the code...
这意味着i
在每次迭代时被设置为数组中的下一个值,无论您在上一次迭代中使用i
做了什么
观测值:
正如所指出的那样,在python 3中range(10)
实际创建了一个范围对象range(0,10)
,它的功能类似于上面示例中的列表,但并不完全相同。它是一个只存储起始值,停止值和步长值的对象,以便不存储整个列表,并根据需要计算项目。
为了理解你问题中发生了什么,他们将会大致相同