Озадачены областью действия переменной в цикле for - PullRequest
1 голос
/ 02 августа 2020

Этот код вызовет 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 ]

4 голосов
/ 02 августа 2020

Когда n равно 2, range(2,n) будет пустым списком, и поэтому тело этого l oop не будет выполняться вообще.

3 голосов
/ 02 августа 2020

Это не имеет ничего общего с областями видимости, на самом деле 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.

...