对for循环中的可变范围感到困惑

时间:2020-08-02 14:24:37

标签: python scope

此代码将引发NameError: name 'i' is not defined

for n in range(2, 101):
    for i in range(2, n):
        if n % i == 0:
            break
    if n % i != 0:
        print(n, end=' |')

此代码将正确执行:

n = 97
if True:
    for i in range(2, n):
        if n % i == 0:
            break
    if n % i != 0:
        print(n, end=' |')

有人可以告诉原因吗?

2 个答案:

答案 0 :(得分:4)

n为2时,range(2,n)将是一个空列表,因此该循环的主体将根本不会执行。

答案 1 :(得分:3)

这与作用域无关,实际上python中的for循环除非在list comprehension中,否则不会创建自己的作用域。出现错误的原因是第一个代码未创建i

for n in range(2,101):
# at first iteration n == 2
    for i in range(2,n):
    # this is equivalent to range(2,2) in first iteration

因此,没有要迭代的内容,因此没有将值分配给i。而到n % i时,它会抛出NameError

在第二个块中:

for i in range(2, n):
# value if i is 2

由于i具有一个值,因此已定义,因此它不会抛出NameError