python - 在 python 的两层循环中使用相同的变量时发生了什么?

标签 python scope

我测试以下代码:

for i in range(3):
    for i in range(3,5):
        print "inner i: %d"%(i)
    print "outer i: %d"%(i)

输出是:

inner i: 3
inner i: 4
outer i: 4
inner i: 3
inner i: 4
outer i: 4
inner i: 3
inner i: 4
outer i: 4

我不明白为什么在外循环中 i 是 4 但外循环仍然运行了 3 次。似乎 print "outer i: %d"%(i) 行中的变量 i 是内部循环中的 i ,但是当转到 for i in range(3) 时,它在外循环中使用 i。

谁能解释一下?现在我有点困惑。

最佳答案

它是相同的i,Python 没有 block 作用域。在每个 for 循环迭代的开始,您将迭代器中的下一个值分配给 i。 Python for 循环不像 C/Java for 循环,它们是 foreach 循环。继续直到迭代器耗尽(或者你以某种方式break)。 for 循环等效于以下 while 循环:

iterator = iter(my_iterable)
while True:
    try:
        x = next(iterator)
    except StopIteration:
        break
    do_stuff(x)

因此,您的嵌套循环等效于此:

it1 = iter(range(3))
while True:
    try:
        i = next(it1)
    except StopIteration:
        break

    it2 = iter(range(3, 5))
    while True:
        try:
            i = next(it2)
        except StopIteration:
            break
        print "inner i: %d"%(i)

    print "outer i after: %d"%(i)

注意,一个 C/Java for 循环,例如:

for (int i = 0; i < stop; i++){
    do_stuff(i);
}

将在 Python 中:

i = 0
while i < stop:
   do_stuff(i)
   i += 1

也就是说,经典for循环依赖于i,即终止条件依赖于i的值。但是在 for-each 循环中,终止条件取决于迭代器。而且,无论您对体内的变量做什么,在每次迭代开始时,它都会被赋予迭代器的下一个值。

关于python - 在 python 的两层循环中使用相同的变量时发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47347945/

相关文章:

python - 如何获取(网络)字体中单个字符的大小?

python - conda--无法安装、卸载或更改基本环境中的任何内容

python - 如何应用按位运算符来比较对象列表

python - subprocess.call() 的返回值是多少?

r - 并行计算时函数参数中的变量不会传递给集群

Javascript 无法理解技巧变量 "hoisting": why it's NaN value?

Java方法范围问题

python - mypy错误,Union/Optional重载, “Overloaded function signatures 1 and 2 overlap with incompatible return types”

c++ - 命名空间、函数模板和静态数据的作用域困境

python - Python 类中的命名空间