Что такое область видимости переменных python

Области видимости переменных

На предыдущих занятиях я иногда произносил фразы: локальная переменная, глобальная переменная. Давайте теперь подробнее разберемся что это за переменные и как с ними работать.

Если сказать по простому, то

Глобальная переменная – это переменная доступная в любом месте программы.

Как можно ее задать? Очень просто – в начале текстового файла, например:

Однако, использование глобальных переменных считается плохим стилем программирования. И допускается, разве что, задавать глобальные константы, используемые во всей программе. А имена констант записывать заглавными буквами, чтобы отличать их от обычных не глобальных (то есть, локальных) переменных.

Локальные переменные – это переменные, объявленные внутри любого блока программы.

Здесь у нас сразу три локальных переменных: b, n, x. Почему локальные? Дело в том, что они доступны только внутри функции myFunc и не существуют за ее пределами. Если мы попытаемся после функции выполнить операцию, например:

то возникнет ошибка, что x не существует. А вот внутри функции все три переменные существуют:

Обратите внимание, здесь цикл for не образует своих локальных переменных, как это происходит, например, в С++ или Java, и вот эта переменная n продолжает существовать и за его пределами.

Ну, хорошо, а как мы можем работать с глобальной переменной внутри этой функции? Если написать вот такую конструкцию:

и после вызова этой функции вывести значение переменной a:

то увидим прежнее значение 5. Почему? Дело в том, что когда мы присвоили a=10, то внутри функции была создана локальная переменная с таким же именем a и на значение глобальной переменной это никак не повлияло.

Более наглядный пример использования локальной переменной с тем же именем, что и глобальная, такой:

Hello Tom
Good bye Bob

То есть, первая функция использовала глобальную переменную name, т.к. никакой другой для нее не существовало, а вторая функция использовала локальную name, объявленную внутри нее. Этот пример показывает, что функция сначала пытается найти нужную переменную внутри собственной области видимости, и если не находит, то переходит на более высокий уровень, в данном случае – глобальной области.

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

Если же мы хотим поменять именно глобальную переменную, то в функции следует вначале это явно сказать:

тем самым мы указываем, что хотим работать с глобальной a, а не создавать локальную переменную. Теперь, при выполнении этой программы, мы видим измененное значение глобальной переменной a.

Однако, здесь следует быть аккуратным, так как если в функции уже была создана локальная a, то конструкция global приведет к ошибке:

Так можно делать только в отсутствии соответствующих локальных переменных.

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

В Python имеется один интересный режим работы с локальными переменными с использованием ключевого слова nonlocal. Давайте предположим, что у нас имеется объявление одной функции внутри другой:

При запуске программы мы увидим ожидаемые результаты:

inner: 2
outer: 1
global: 0

А теперь внутри функции inner мы скажем, что хотим работать с переменной x, объявленной уровнем выше, то есть, внутри функции outer:

Теперь строка x=2 будет означать изменение переменной x в функции outer и при запуске программы получим результаты:

inner: 2
outer: 2
global: 0

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

Но так можно делать только с локальными переменными. С глобальной работать не будет. Если мы пропишем строчку

в функции outer, то возникнет ошибка, т.к. уровнем выше находится уже глобальная область. Здесь, вместо nonlocal следует уже использовать global:

а nonlocal в inner убрать, иначе опять же получится ссылка на глобальную переменную.

Итак, на этом занятии мы с вами рассмотрели глобальную и локальную области видимости переменных и познакомились с ключевыми словами global и nonlocal.

Видео по теме

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#1. Первое знакомство с Python Установка на компьютер

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#2. Варианты исполнения команд. Переходим в PyCharm

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#3. Переменные, оператор присваивания, функции type и id

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#4. Числовые типы, арифметические операции

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#5. Математические функции и работа с модулем math

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#6. Функции print() и input(). Преобразование строк в числа int() и float()

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#7. Логический тип bool. Операторы сравнения и операторы and, or, not

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#8. Введение в строки. Базовые операции над строками

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#9. Знакомство с индексами и срезами строк

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#10. Основные методы строк

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#11. Спецсимволы, экранирование символов, row-строки

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#12. Форматирование строк: метод format и F-строки

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#14. Срезы списков и сравнение списков

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#15. Основные методы списков

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#16. Вложенные списки, многомерные списки

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#17. Условный оператор if. Конструкция if-else

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#18. Вложенные условия и множественный выбор. Конструкция if-elif-else

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#19. Тернарный условный оператор. Вложенное тернарное условие

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#20. Оператор цикла while

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#21. Операторы циклов break, continue и else

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#22. Оператор цикла for. Функция range()

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#23. Примеры работы оператора цикла for. Функция enumerate()

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#24. Итератор и итерируемые объекты. Функции iter() и next()

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#25. Вложенные циклы. Примеры задач с вложенными циклами

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#26. Треугольник Паскаля как пример работы вложенных циклов

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#27. Генераторы списков (List comprehensions)

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#28. Вложенные генераторы списков

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#29. Введение в словари (dict). Базовые операции над словарями

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#30. Методы словаря, перебор элементов словаря в цикле

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#31. Кортежи (tuple) и их методы

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#32. Множества (set) и их методы

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#33. Операции над множествами, сравнение множеств

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#34. Генераторы множеств и генераторы словарей

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#35. Функции: первое знакомство, определение def и их вызов

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#36. Оператор return в функциях. Функциональное программирование

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#37. Алгоритм Евклида для нахождения НОД

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#38. Именованные аргументы. Фактические и формальные параметры

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#39. Функции с произвольным числом параметров *args и **kwargs

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#40. Операторы * и ** для упаковки и распаковки коллекций

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#41. Рекурсивные функции

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#42. Анонимные (lambda) функции

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#43. Области видимости переменных. Ключевые слова global и nonlocal

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#44. Замыкания в Python

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#45. Введение в декораторы функций

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#46. Декораторы с параметрами. Сохранение свойств декорируемых функций

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#47. Импорт стандартных модулей. Команды import и from

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#48. Импорт собственных модулей

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#49. Установка сторонних модулей (pip install). Пакетная установка

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#50. Пакеты (package) в Python. Вложенные пакеты

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#51. Функция open. Чтение данных из файла

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#53. Запись данных в файл в текстовом и бинарном режимах

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#54. Выражения генераторы

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#55. Функция-генератор. Оператор yield

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#56. Функция map. Примеры ее использования

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#57. Функция filter для отбора значений итерируемых объектов

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#58. Функция zip. Примеры использования

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#59. Сортировка с помощью метода sort и функции sorted

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#60. Аргумент key для сортировки коллекций по ключу

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#61. Функции isinstance и type для проверки типов данных

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#62. Функции all и any. Примеры их использования

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#63. Расширенное представление чисел. Системы счисления

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

#65. Модуль random стандартной библиотеки

© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Источник

Как использовать global и nonlocal переменные в Python

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

В этой статье мы рассмотрим глобальные и нелокальные переменные в Python и как их использовать, чтобы избежать проблем при написании кода.

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

Области видимости в Python

Прежде чем мы сможем начать, мы сначала должны коснуться областей. Для тех из вас, кто не знаком, «область видимости» относится к контексту, в котором определяется переменная и как к ней можно получить доступ или изменить или, более конкретно, откуда она может быть получена.

И в программировании, как и в жизни, важен контекст.

Ссылаясь на Python прямо сейчас, вы можете сделать вывод из контекста, что я имею в виду язык программирования. Однако в другом контексте Python может быть ссылкой на змею или комедийную группу.

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

Локальные переменные в Python

Как и ожидалось, этот код выведет нам:

Но что происходит, когда мы перемещаем оператор печати за пределы функции?

Мы получаем ошибку:

Чтобы наша программа могла понимать переменную глобально (вне функции), нам нужно определить ее глобально.

Глобальные переменные в Python

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

В этом случае мы можем ссылаться на нее вне функции, и все работает.

Это потому, что fruit мы изменили в функции shopping_list() создав новую локальную переменную. Мы создали ее, присвоили ей значение и после этого ничего не сделали. Это фактически полностью избыточный код. print() выводит значение глобальной переменной.

Ключевое слово global

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

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

Мы могли бы даже объявить глобальную переменную в одной функции и получить к ней доступ в другой, не определяя ее как глобальную во второй:

Осторожность при использовании глобальных переменных

Всегда важно убедиться, что вы манипулируете переменной только в том контексте, который вам нужен, а в противном случае, оставив его в покое, это основной движущий принцип принципа инкапсуляции.

Мы быстро рассмотрим пример потенциальной проблемы, прежде чем перейти к некоторым из способов, которыми глобальные переменные могут быть полезны в вашем собственном коде:

Запустив приведенный выше код, мы получим следующий вывод:

Если мы изменим этот порядок или попытаемся повторить его позже, мы столкнемся с большой проблемой:

Теперь это выводит:

А именно, теперь fruit это строка, которая будет повторяться. Что еще хуже, эта ошибка не проявляется, пока, по-видимому, не станет слишком поздно. Первый код вроде бы работал нормально.

Ключевое слово nonlocal

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

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

Запустив приведенный выше код, мы получим результат:

Таким образом, глобальная переменная count по-прежнему является локальной для внешней функции и не влияет (или не существует) на более высоком уровне. Это дает вам некоторую свободу в добавлении модификаторов к вашим функциям.

Вы всегда можете подтвердить это, попробовав распечатать pct_off не с помощью метода подсчета покупок:

Заключение

Источник

Область видимости в Python

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

Что такое область видимости переменных python. Смотреть фото Что такое область видимости переменных python. Смотреть картинку Что такое область видимости переменных python. Картинка про Что такое область видимости переменных python. Фото Что такое область видимости переменных python

Вы, наверное, не раз слышали термин область видимости, когда изучали программирование. Это весьма важная тема, незнание которой может привести к достаточно запутанным ошибкам. Область видимости указывает интерпретатору, когда наименование (или переменная) видимо. Другими словами, область видимости определяет, когда и где вы можете использовать свои переменные, функции, и т.д. Если вы попытаетесь использовать что-либо, что не является в вашей области видимости, вы получите ошибку NameError.

Python содержит три разных типа области видимости:

Локальная область видимости

Локальная область видимости наиболее часто используется в Python. Когда мы создаем переменную в блоке кода, она будет разрешена при помощи ближайшей области видимости, или областей. Группирование всех этих областей известно как среда блоков кода. Другими словами, все назначения выполняются в локальной области по умолчанию. Если вам нужно что-то другое, тогда вам нужно настроить свою переменную на глобальную или нелокальную область, которые мы рассмотрим немного позже. Сейчас мы создадим простой пример, используя интерпретатор Python, в котором демонстрируется назначение локальной области видимости.

Источник

Область видимости

Область видимости переменных в языке программирования Python представляет собой некое пространство имен, в рамках которого функционируют созданные объекты. Эта особенность позволяет ограничивать доступ к определенным значениям во избежание конфликтов между одинаковыми идентификаторами. Переменные бывают двух видов: локальные и глобальные, что в большинстве случае определяется местом их первичной идентификации в программе.

Локальные переменные

Для создания переменных, обладающих локальной областью видимости, необходимо всего лишь поместить их в отдельный блок кода, изолированный от остальной программы. Чтобы увидеть локальную переменную в действии, достаточно инициализировать целочисленный объект с именем x и значением 100 в функции f, как это сделано в следующем примере:

Здесь x имеет локальную область видимости, так как доступна лишь в рамках своей функции f. Вызывая данную функцию из внешней части программы, можно увидеть вывод целочисленного значения на экране. Однако, если попытаться вывести переменную x при помощи метода print вне зоны действия функции f, компилятор тут же выдаст ошибку:

Так происходит из-за того, что внешняя часть программы ничего не знает о переменной x, поскольку содержит в себе совсем другое пространство имен. Пользоваться локальными объектами можно только в той области, где они были идентифицированы. В обратном же случае компилятор сообщит об ошибке, не сумев обнаружить необходимую переменную.

Глобальные переменные

Чтобы иметь возможность использовать некоторое значение в любой части программы, следует объявить глобальную переменную. Для этого понадобиться создать переменную отдельно от области кода, ограниченной определенным блоком кода, например, функцией. В следующем примере демонстрируется идентификация целочисленного типа данных под названием x, который позже выводится на экран при помощи метода print в функции f:

Как можно заметить из результатов выполнения программы, значение 100 воспроизводится не только через f, но и с помощью обычного print. Таким образом, получение доступа к x осуществляется из любой части кода, благодаря глобальной области видимости подобного объекта. Но что будет, если попытаться изменить значение глобальной переменной в некой функции? Результаты такого эксперимента представлены в следующем фрагменте кода:

Функция f присваивает значение 200 переменной с именем x, однако, вопреки ожиданиям, внешний метод print выводит число 100, которое принадлежало x изначально. Происходит так потому, что в данной программе создаются два разных объекта x с локальной, а также глобальной областью видимости. Исправить ситуацию поможет ключевое слово global:

Пометив переменную x как global, можно обращаться к ее изначальному значению, которое было определено вне зоны действия функции f. Теперь после того как в x поместили число 200, вызов метода print выводит вполне ожидаемый результат, то есть измененное значение.

Но все таки не стоит злоупотреблять. Зачастую гораздо правильнее передавать в функции необходимые значения в качестве аргуменов, а если нужно перезаписать какое-то глобальное значение, то возвращать его из функции.

Нелокальные переменные

Итак, для обращения к глобальной переменной внутри функции f необходимо использовать ключевое слово global перед ее идентификатором. Но что если требуется вызывать совсем не глобальную, а переменную, которая была определена во внешнем методе, являясь при этом локальной для другого пространства имен, находящегося на уровень выше? Следующий код демонстрирует попытку взаимодействия со значением из внешней функции f1 в методе f2:

Несмотря на то, что переменной с таким же именем x было присвоено новое значение 200, в результате выполнения написанных методов на экране отобразилось 100. Как и в том случае с двумя разными переменными, локальной и глобальной, здесь имеется также два различных объекта, которые идентифицированы в отдельных блоках кода. Чтобы обратиться к объекту, который не является локальным, необходимо воспользоваться модификатором nonlocal:

Таким образом, в методе f2 осуществляется запись значения 200 в переменную x из функции f1. В результате подобных действий, вызов метода f1 из внешней части программы создает новую переменную x, значение которой меняется в f2 со 100 на 200 и выводится при помощи print.

Видимость из загружаемого модуля

Теперь разберемся с видимостью глобальных переменных между загружаемыми модулями Python. Например, мы подключаем другой модуль с помощью команды import. Создадим файл «test.py» и в него запишем следующий код:

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

Теперь создадим файл main.py, который и будем запускать. В нем мы импортируем модуль test, а так же создадим свою глобальную переменную x. После этого выведем значения глобальной переменной из test, вызовим функцию f, а так же проверим, что значение переменной в модуле main не изменилось:

Мы в первой же строчке записали в x значение 200. Это было сделано, чтобы показать, что после того, как мы загрузим внешний модуль, значение этой переменной не изменится. Так и вышло. Обращаясь к переменной из загруженной библиотеки, удалось прочитать его и изменить значение.

Теперь модифицируем программу следующим образом:

В этом случае для загрузки мы использовали команду «from test import *». Мы импортировали все переменные и функции. После загрузки модуля значение переменной x в модуле main изменилось. Но при вызове функции, мы получаем значение x из модуля test. После присвоения нового значения переменной x, значение, которое выводит функция f не изменяется.

Глобальные переменные в классе

Точно так же как и в функциях, можно обращаться к глобальным переменным и в классе Python. Разберем пример:

Мы объявили глобальную переменную x. Вывели значение переменной до и после объявления класса. Как видим значение изменилось. После того как мы создали объект класса, значение в очередной раз поменялось. Это произошло, потому что сработал конструктор класса — метод __init__. После вызова функции f у созданного объекта, значение стало 400. В Python использование global переменная и в функции класса, и в его конструкторе, и после описания класса дают возможность изменения глобальной переменной. Если убрать это объявление, то тогда выполнится присвоение локальной переменной.

Конечно же если мы определим локальную переменную в классе, то к ней не будет возможности доступа из другого класса:

Для того, чтобы код работал, переменная x должна быль глобальной.

Заключение

Таким образом, область видимости переменных в языке программирования Python, является важной составляющей платформы. Правильное взаимодействие со всеми ее особенностями позволяет избежать множества довольно сложных ошибок. Для более безопасного контроля над видимостью отдельных объектов применяются ключевые слова global и nonlocal. Чтобы ознакомиться с дополнительными сведениями по данной теме, следует изучить PEP 3104.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *