python如何区分具有相同名称的变量

时间:2018-01-16 14:50:41

标签: python

我不明白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的规则是什么决定是否隐式声明一个新变量?

3 个答案:

答案 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),它的功能类似于上面示例中的列表,但并不完全相同。它是一个只存储起始值,停止值和步长值的对象,以便不存储整个列表,并根据需要计算项目。

为了理解你问题中发生了什么,他们将会大致相同