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