локальная переменная Python - когда мне нужно присвоить значение? - PullRequest
0 голосов
/ 11 сентября 2018

Я программист-любитель и хотел бы получить совет при изучении кодов. Здесь я сталкиваюсь с некоторыми проблемами.

Я обнаружил, что когда я удаляю комментарий "# X = 3" и превращаю его в код из приведенного ниже, код работает. Без X = 3 код приводит к UnboundLocalError.

Просмотр в Интернете, это связано с глобальной и локальной переменной, но я не вижу, как это связано. И когда X должен быть обозначен перед циклом while? и почему "для y в простых числах" не нужно предварительно определять "y"?

Основная цель кода: подсчитать количество простых чисел до (num)

def count_primes2(num):
    primes = [2]
    #x = 3
    if num < 2:
        return 0
    while x <= num:
        for y in primes:  # use the primes list!
            if x%y == 0:
                x += 2
                break
        else:
            primes.append(x)
            x += 2
    print(primes)
    return len(primes)

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Согласно шаблону переменная должна быть создана непосредственно перед использованием. В коде вы используете x без создания или инициализации значения по умолчанию. "y" = вы перебираете список (простые числа). Таким образом, в каждой итерации y будет инициализироваться текущим значением. Так что это не даст никакой ошибки.

0 голосов
/ 11 сентября 2018

Вам необходимо создать (и присвоить значение) переменную, прежде чем использовать ее. Если вы попытаетесь использовать значение переменной до создания переменной, то вы получите исключение. Вы делаете именно это в выражении while: Вы спрашиваете, является ли его значение ниже или равно num, но оно еще даже не существует, оно не имеет значения, это вызывает исключение.

Теперь, почему вы получаете UnboundLocalError?

Компилятор просматривает ваш код, прежде чем код будет выполнен. На этом этапе компиляции он замечает, что вы где-то в своей функции присваиваете значение X, а именно в строке x += 2. (Их даже два.) Это помечает переменную для компилятора как локальная переменная.

Так что, если вы попытаетесь получить доступ к переменной до присвоения, переменная еще не существует, но код уже знает, что она должна быть локальной переменной следовательно UnboundLocalError.

Без любого оператора присваивания для X в функции вы бы получили NameError, потому что во время выполнения оператора while интерпретатор затем ищет глобальную переменную с этим именем.

0 голосов
/ 11 сентября 2018

Для расширения, так как вы используете x в критериях цикла while, да, это должно быть определено ранее.Вам не нужно определять y перед циклом for, потому что строка for y in primes определяет y в качестве каждого элемента в списке.

Примерный перевод на простой английский:

while x <= num: == Пока это число меньше или равно этому другому числу, выполните следующие действия:

for y in primes == выполните следующие действия для каждого элемента с именем y в простых числах

, надеюсь, это не смущает

...