对for循环中的变量作用域感到困惑



此代码将引发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=' |')

有人能说出原因吗?

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

这与作用域无关,事实上,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

最新更新