Читайте сначала: Первая часть
Ранее мы обсудили принцип матрёшки для поиска имён переменных. Повторим ещё раз пример на JavaScript:
Здесь есть переменная "a", объявленная во внешнем (глобальном) контексте со значением 5; ещё одна переменная "a", объявленная в контексте функции test() со значением 10, и ещё одна переменная "a", объявленная внутри блока if() внутри функции test() со значением 1.
Мы три раза выводим на печать значение переменной "a".
Первый раз – внутри блока if() внутри функции, второй раз – просто внутри функции, и наконец вне функции, в глобальном контексте.
Мы получим следующие значения: 1, 10, 5. То есть ни одна переменная не перепуталась с другой. Это три разных адреса памяти с тремя разными значениями, просто имя "a" каждый раз указывает на другой адрес.
Осталось рассмотреть работу с параметрами функции.
Итак, в функцию test() передаётся аргумент с именем "a". Функция выводит на печать значение этого аргумента. Имеет ли имя аргумента "a" какое-либо отношение к переменной с именем "a"?
Как можно видеть ниже, мы вызвали функцию три раза. Сначала мы передали в неё переменную "a", затем переменную "b", а затем вообще не переменную – число 100.
С нашей стороны, то есть снаружи функции, это выглядит так, что мы берём разные сущности и передаём их в функцию.
Изнутри функции это выглядит так:
– О, кто-то пришёл. Ты кто? А впрочем, мне всё равно, я буду называть тебя "a".
То есть имя аргумента так же локально и временно, как и прочие имена, созданные внутри функции.
Есть небольшой нюанс: так как имя "a" уже занято внутри функции, то из неё нельзя будет обратиться к глобальной переменной "a" вне функции. А вот к глобальной переменной "b" обратиться можно, потому что имя не было замещено локальным вариантом.
Поэтому параметрам и локальным пременным в функции можно давать любые имена, но если вы внутри функции планируете обращаться к внешним (глобальным) переменным, нужно, чтобы локальные имена не совпадали с глобальными.
Возвращаемся к примеру на Python, с которого всё и началось:
В функции test() используется аргумент x, имя которого совпадает с именем глобальной переменной x. Из этого следует, что любое значение, переданное в функцию, внутри неё будет называться x, а вот внешний x при этом будет недоступен. Редактор предупреждает об этом.
Что делать с этим предупреждением?
А можно ничего не делать. Это не ошибка. Но если хотите просто убрать предупреждение, то достаточно изменить имя параметра на другое, например, n:
Но менять его, естественно, надо не только в скобках, а везде, где оно используется внутри функции.
В следующий раз мы обсудим передачу аргументов в функцию по значению и по указателю.
Читайте дальше: Что передаётся в функцию?
Читайте также:
- Типы данных и указатели
- Глобальные и локальные переменные