Найти тему
ZDG

Как новичку-программисту не запутаться в именах переменных. Окончание.

Читайте сначала: Первая часть

Ранее мы обсудили принцип матрёшки для поиска имён переменных. Повторим ещё раз пример на JavaScript:

Здесь есть переменная "a", объявленная во внешнем (глобальном) контексте со значением 5; ещё одна переменная "a", объявленная в контексте функции test() со значением 10, и ещё одна переменная "a", объявленная внутри блока if() внутри функции test() со значением 1.

Мы три раза выводим на печать значение переменной "a".

Первый раз – внутри блока if() внутри функции, второй раз – просто внутри функции, и наконец вне функции, в глобальном контексте.

Мы получим следующие значения: 1, 10, 5. То есть ни одна переменная не перепуталась с другой. Это три разных адреса памяти с тремя разными значениями, просто имя "a" каждый раз указывает на другой адрес.

Видите матрёшку?
Видите матрёшку?

Осталось рассмотреть работу с параметрами функции.

-3

Итак, в функцию test() передаётся аргумент с именем "a". Функция выводит на печать значение этого аргумента. Имеет ли имя аргумента "a" какое-либо отношение к переменной с именем "a"?

Как можно видеть ниже, мы вызвали функцию три раза. Сначала мы передали в неё переменную "a", затем переменную "b", а затем вообще не переменную – число 100.

С нашей стороны, то есть снаружи функции, это выглядит так, что мы берём разные сущности и передаём их в функцию.

Изнутри функции это выглядит так:

– О, кто-то пришёл. Ты кто? А впрочем, мне всё равно, я буду называть тебя "a".

Коллаж на основе картины "Не ждали". Художник Илья Репин.
Коллаж на основе картины "Не ждали". Художник Илья Репин.

То есть имя аргумента так же локально и временно, как и прочие имена, созданные внутри функции.

Есть небольшой нюанс: так как имя "a" уже занято внутри функции, то из неё нельзя будет обратиться к глобальной переменной "a" вне функции. А вот к глобальной переменной "b" обратиться можно, потому что имя не было замещено локальным вариантом.

Поэтому параметрам и локальным пременным в функции можно давать любые имена, но если вы внутри функции планируете обращаться к внешним (глобальным) переменным, нужно, чтобы локальные имена не совпадали с глобальными.

Возвращаемся к примеру на Python, с которого всё и началось:

-5

В функции test() используется аргумент x, имя которого совпадает с именем глобальной переменной x. Из этого следует, что любое значение, переданное в функцию, внутри неё будет называться x, а вот внешний x при этом будет недоступен. Редактор предупреждает об этом.

Что делать с этим предупреждением?

А можно ничего не делать. Это не ошибка. Но если хотите просто убрать предупреждение, то достаточно изменить имя параметра на другое, например, n:

-6

Но менять его, естественно, надо не только в скобках, а везде, где оно используется внутри функции.

В следующий раз мы обсудим передачу аргументов в функцию по значению и по указателю.

Читайте дальше: Что передаётся в функцию?

Читайте также:

  • Типы данных и указатели
  • Глобальные и локальные переменные