Ситуация: обычный рабочий проект, пишем простую функцию сложения, которая возвращает сумму двух чисел:
def calculate_sum(x, y):
total = x + y
return total
Немного позже нам нужно использовать эту функцию, чтобы что-то посчитать. Берём две переменные и указываем их как аргументы при вызове:
value = 600
diffusion = 700
c = calculate_sum(value, difusion)
print(c)
Но при запуске компьютер вдруг выдаёт ошибку:
❌ NameError: name 'difusion' is not defined
Что это значит: Python не понимает, откуда взялась переменная difusion. и не знает, как с ней работать.
Когда встречается: эта ошибка может появиться, когда разработчик:
- допустил опечатку в названии аргумента или функции;
- использовал переменную или функцию раньше чем определил их;
- обратился к переменной или функции, которые находятся вне той области видимости, с которой он работает.
Область видимости определяет, к каким переменным функция, команда или другая переменная может получить доступ, а к каким нет. Проще говоря, что каждая функция «видит» — видит ли она те переменные и объекты, которые созданы за её пределами? Видит ли она то, что вложено в функции, которые запускаются внутри неё?
Обычно так: если переменная объявлена в самой программе, к ней можно получить доступ из вложенной функции. А если объявить переменную внутри функции, то обратиться к ней извне не получится.
Что делать с ошибкой NameError
В нашем примере — опечатка: мы написали difusion
вместо diffusion
. Исправляем ошибку и получаем рабочий код:
def calculate_sum(x, y):
total = x + y
return total
value = 600
diffusion = 700
c = calculate_sum(value, diffusion)
print(c)
В простом коде такую ошибку заметить легко, но если мы будем работать со сложным проектом, где несколько тысяч строк кода, то это может стать проблемой. С другой стороны, современные редакторы кода сами следят за тем, какие переменные есть в проекте и помечают те, которые используются по ошибке:
Ту же ошибку мы получим, если попробуем сначала вызвать функцию даже с правильными аргументами до того, как определим их:
А вот пример такой же ошибки с областью видимости: в одной функции мы объявляем переменные, а потом пробуем использовать их в основной программе. Проблема в том, что код не видит переменные внутри функции, поэтому не может получить их значения при вызове: