Это не имеет ничего общего с областями видимости, на самом деле for
циклы в python не создают свои собственные области, если только они не находятся в 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
.