Как изменить переменную вне функции python

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

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

С другой стороны, переменная, объявленная внутри определенного блока кода, будет видна только внутри этого же блока — она называется локальной.

Разберемся с этими понятиями на примере.

Пример локальных и глобальных переменных

def sum():  
    a = 10   # локальные переменные 
    b = 20  
    c = a + b  
    print("Сумма:", c)  
  
sum() 

Вывод: Сумма: 30.

Переменная объявлена внутри функции и может использоваться только в ней. Получить доступ к этой локальной функции в других нельзя.

Для решения этой проблемы используются глобальные переменные.

Теперь взгляните на этот пример с глобальными переменными:

a = 20  # определены вне функции
b = 10  


def sum():  
    c = a + b  # Использование глобальных переменных  
    print("Сумма:", c)  

  
def sub():  
    d = a - b  # Использование глобальных переменных 
    print("Разница:", d)  
  
  
sum()
sub()

Вывод:

Сумма: 30
Разница: 10

В этом коде были объявлены две глобальные переменные: a и b. Они используются внутри функций sum() и sub(). Обе возвращают результат при вызове.

Если определить локальную переменную с тем же именем, то приоритет будет у нее. Посмотрите, как в функции msg это реализовано.

def msg():  
    m = "Привет, как дела?"  
    print(m)  
  
msg()  
m = "Отлично!"  # глобальная переменная
print(m) 

Вывод:

Привет, как дела?
Отлично!

Здесь была объявлена локальная переменная с таким же именем, как и у глобальной. Сперва выводится значение локальной, а после этого — глобальной.

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

Правила использования global

  • Если значение определено на выходе функции, то оно автоматически станет глобальной переменной.
  • Ключевое слово global используется для объявления глобальной переменной внутри функции.
  • Нет необходимости использовать global для объявления глобальной переменной вне функции.
  • Переменные, на которые есть ссылка внутри функции, неявно являются глобальными.

Пример без использования глобального ключевого слова.

c = 10  


def mul():
    c = c * 10 
    print(c) 


mul() 

Вывод:

line 5, in mul
    c = c * 10
UnboundLocalError: local variable 'c' referenced before assignment

Этот код вернул ошибку, потому что была предпринята попытка присвоить значение глобальной переменной. Изменять значение можно только с помощью ключевого слова global.

c = 10  


def mul():
    global c
    c = c * 10 
    print("Значение в функции:", c)  

mul()  
print("Значение вне функции:", c)  

Вывод:

Значение в функции: 100
Значение вне функции: 100

Здесь переменная c была объявлена в функции mul() с помощью ключевого слова global. Ее значение умножается на 10 и становится равным 100. В процессе работы программы можно увидеть, что изменение значения внутри функции отражается на глобальном значении переменной.

Глобальные переменные в модулях Python

Преимущество использования ключевого слова global — в возможности создавать глобальные переменные и передавать их между модулями. Например, можно создать name.py, который бы состоял из глобальных переменных. Если их изменить, то изменения повлияют на все места, где эти переменные встречаются.

1. Создаем файл name.py для хранения глобальных переменных:

a = 10 
b = 20 
msg = "Hello World"

2. Создаем файл change.py для изменения переменных:

import name

name.a = 15  
name.b = 25
name.msg = "Dood bye"  

Меняем значения a, b и msg. Эти переменные были объявлены внутри name, и для их изменения модуль нужно было импортировать.

3. В третий файл выводим значения измененных глобальных переменных.

import name
import change

print(name.a) 
print(name.b)
print(name.msg)

Значение изменилось. Вывод:

15
25
Dood bye

Global во вложенных функциях

Можно использовать ключевое слово global во вложенных функциях.

def add():
    a = 15
  
    def modify():
        global a
        a = 20

    print("Перед изменением:", a)
    print("Внесение изменений")
    modify()
    print("После изменения:", a)


add()
print("Значение a:", a)  

Вывод:

Перед изменением: 15
Внесение изменений
После изменения: 15
Значение a: 20

В этом коде значение внутри add() принимает значение локальной переменной x = 15. В modify() оно переназначается и принимает значение 20 благодаря global. Это и отображается в переменной функции add().

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

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

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

def f():
    x = 100
    print(x)
f()

100

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

def f():
    x = 100
    print(x)
f()
print(x)

100
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    print(x)
NameError: name 'x' is not defined

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

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

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

x = 100
def f():
    print(x)
f()
print(x)

100
100

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

x = 100
def f():
    x = 200
f()
print(x)

100

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

x = 100
def f():
    global x
    x = 200
f()
print(x)

200

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

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

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

def my_abs(val):
    return -val if val < 0 else val
    return val + 1
x = -15
x = my_abs(x)

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

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

def f1():
    x = 100
    def f2():
        x = 200
    f2()
    print(x)
f1()

100

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

def f1():
    x = 100
    def f2():
        nonlocal x
        x = 200
    f2()
    print(x)
f1()

200

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

Важно заметить, что конструкция nonlocal была добавлена только в 3-ей версии языка Python.

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

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

print('Загружается модуль test')
x = 100
def f():
    print('Из функции x=' + str(x))

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

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

x = 200
print('Из модуля main x=' + str(x))
import test
print('Из модуля test x=' + str(test.x))
print('Присваиваем значение 300')
test.x = 300;
print('Из модуля test x=' + str(test.x))
test.f()
print('Из модуля main x=' + str(x))

Из модуля main x=200
Загружается модуль test
Из модуля test x=100
Присваиваем значение 300
Из модуля test x=300
Из функции x=300
Из модуля main x=200

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

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

x = 200
print('Из модуля main x=' + str(x))
from test import *
f()
print('Из модуля main x=' + str(x))
print('Присваиваем значение 300')
x = 300
f()
print('Из модуля main x=' + str(x))

Из модуля main x=200
Загружается модуль test
Из функции x=100
Из модуля main x=100
Присваиваем значение 300
Из функции x=100
Из модуля main x=300

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

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

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

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

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

x = 100
print(x)
class c1:
    global x
    x = 200
    def __init__(self):
        global x
        x = 300
    def f(self):
        global x
        x = 400
print(x)
o1 = c1()
print(x)
o1.f()
print(x)

100
200
300
400

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

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

class c1:
    x = 100
class c2:
    def f(self):
        print(x)
o = c2()
o.f()

Traceback (most recent call last):
  File "main.py", line 7, in <module> 
    o.f()
  File "main.py", line 5, in f
    print(x)
NameError: name 'x' is not defined

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

Заключение

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

В процессе нашего обучения мы изучили ряд встроенных в Python функций: print(), input(), max(), min() и другие. Часто в программах требуется использовать какую-то часть кода несколько раз. В таком случае программисты создают функции. Функции помогают использовать написанный код в программах многократно, а также делают код более понятным за счёт деления его на блоки.

Синтаксис создания функции выглядит следующим образом:

def <имя функции>(<аргументы функции>):
    <тело функции>

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

Напишем функцию, которая проверяет, что список целых чисел, передаваемый ей как аргумент, содержит только чётные числа:

def only_even(numbers):
    result = True
    for x in numbers:
        if x % 2 != 0:
            result = False
            break
    return result


print(only_even([2, 4, 6]))
print(only_even([1, 2, 3]))

Вывод программы:

True
False

В функциях можно использовать несколько операторов return. Первый сработавший в теле функции оператор return остановит выполнение функции и вернёт её значение. Наш пример можно упростить, использовав вместо флага result несколько точек возврата значения:

def only_even(numbers):
    for x in numbers:
        if x % 2 != 0:
            return False
    return True


print(only_even([2, 4, 6]))
print(only_even([1, 2, 3]))

Вывод программы:

True
False

Обратите внимание: функция в Python всегда возвращает результат, даже если в ней нет return или присутствует return без возвращаемого значения. Тогда возвращаемый результат будет None — специальный тип данных в Python, который дословно можно перевести с английского как «ничего». Например, None возвращает функция print():

print(print("Эту строку выведет функция до возврата значения."))

Вывод программы:

Эту строку выведет функция до возврата значения.
None

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

def only_even(numbers):
    for i, x in enumerate(numbers):
        if x % 2 != 0:
            return False, i
    return True


print(only_even([2, 4, 6]))
print(only_even([1, 2, 3]))

Вывод программы:

True
(False, 0)

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

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

def only_even(numbers):
    for i, x in enumerate(numbers):
        if x % 2 != 0:
            return False, i
    return True


print(numbers)

Вывод программы:

NameError: name 'numbers' is not defined

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

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

def check_password(pwd):
    return pwd == password


password = "Python"
print(check_password("123"))

Вывод программы:

False

Возможность изменения значения переменной из глобальной области видимости зависит от того к какому типу данных она относится — к изменяемому или неизменяемому. Например, если переменная является списком, то, применив к нему изменяющие его операции и методы, список изменит своё значение:

def list_modify():
    del sample[-1]


sample = [1, 2, 3]
list_modify()
print(sample)

Вывод программы:

[1, 2]

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

def list_modify():
    sample = [4, 5, 6]


sample = [1, 2, 3]
list_modify()
print(sample)

Вывод программы:

[1, 2, 3]

Мы уже знаем, что аргумент функции — это локальная переменная. К нему также относится правило: изменение значения переменной (если это разрешено типом данных) действует на внешнюю переменную, а присваивание нового значения создаёт локальную переменную функции:

def list_modify_1(list_arg):
    # создаём новый локальный список, не имеющий связи с внешним
    list_arg = [1, 2, 3, 4]


def list_modify_2(list_arg):
    # меняем исходный внешний список, переданный как аргумент
    list_arg += [4]


sample_1 = [1, 2, 3]
sample_2 = [1, 2, 3]
list_modify_1(sample_1)
list_modify_2(sample_2)
print(sample_1)
print(sample_2)

Вывод программы:

[1, 2, 3]
[1, 2, 3, 4]

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

def inc():
    global x
    x += 1
    print(f"Количество вызовов функции равно {x}.")


x = 0
inc()
inc()
inc()

Вывод программы:

Количество запусков функции равно 1.
Количество запусков функции равно 2.
Количество запусков функции равно 3.

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

def f(count):
    count += 1
    print(f'Количество вызовов функции равно {count}.')
    return count

    
count_f = 0
count_f = f(count_f)
count_f = f(count_f)
count_f = f(count_f)

Вывод программы:

Количество запусков функции равно 1.
Количество запусков функции равно 2.
Количество запусков функции равно 3.

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

Для начала мы напомним, как вообще объявляются переменные в Python и что означает термин «область видимости переменной».

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

Вы можете представлять себе переменные как некие контейнеры для хранения информации.

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

У переменной есть символическое имя. Вы можете представлять это имя как некую метку на контейнере хранилища, которая действует как ее идентификатор.

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

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

Безусловно, в самом начале обучения вы можете использовать названия переменных в духе a, b, c и т.д. Однако когда вы перейдете к написанию больших программ и начнете разрабатывать серьезные штуки, логичное название переменных станет необходимостью, иначе не то что кто-то другой — вы сами через несколько дней не поймете, что вы написали. Подробней про присваивание имен переменным можно узнать в статье «Факты и мифы об именах и значениях в Python».

Теперь давайте посмотрим, как на деле создавать переменные в Python.

Объявление переменной в Python

Интересно, что при объявлении переменных в Python вам не нужно указывать их тип данных, и это очень удобно.

Например, в языке программирования C вы должны явно указать тип данных, которые будут храниться в переменной. Допустим, вы хотите сохранить свой возраст в виде целого числа или типа int. Тогда на языке C вам нужно написать следующее:

#include <stdio.h>
 
int main(void)
{
  int age = 28;
  // 'int' - это тип данных
  // 'age' - имя переменной 
  // 'age' может хранить целочисленные значения
  // это положительные и отрицательные целые числа, а также 0
  // '=' - оператор присваивания
  // '28' - значение
}

А вот как вы могли бы написать то же самое на Python:

age = 28

#'age' - имя переменной или идентификатор
# '=' - оператор присваивания
#'28' - значение переменной 'age'

Намного проще, не правда ли? Имя переменной всегда находится слева, а значение, которое вы хотите присвоить, идет справа после оператора присваивания =.

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

my_age = 28

print(f"My age in 2022 is {my_age}.")

my_age = 29

print(f"My age in 2023 will be {my_age}.")

#output

#My age in 2022 is 28.
#My age in 2023 will be 29.

Вы сохраняете то же имя переменной, my_age, но меняете значение с 28 на 29.

Что такое «область видимости переменной» в Python?

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

Существует четыре типа области видимости для переменных Python, которые также известны как правило LEGB:

  • Local (локальная область видимости)
  • Enclosing (охватывающая)
  • Global (глобальная)
  • Built-in (встроенная)

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

Как определить локальную переменную в Python

Переменные, определенные внутри тела функции, имеют локальную область видимости. Это означает, что они доступны только внутри данной конкретной функции. Другими словами, они «локальны» для этой функции.

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

def learn_to_code():
    # Создаем локальную переменную
    coding_website = "Pythonist"
    print(f"The best place to learn to code is with {coding_website}!")

# Вызываем функцию
learn_to_code()


#output

#The best place to learn to code is with Pythonist!

Посмотрите, что произойдет, если мы попытаемся получить доступ к этой переменной с локальной областью видимости из-за пределов тела функции:

def learn_to_code():
    # Создаем локальную переменную
    coding_website = "Pythonist"
    print(f"The best place to learn to code is with {coding_website}!")

# Пытаемся вывести локальную переменную 'coding_website' вне функции
print(coding_website)

#output

#NameError: name 'coding_website' is not defined

Код вызывает ошибку NameError, потому что данная переменная «не видна» в остальной части программы. Она доступна только внутри функции, в которой была определена.

Как определить глобальную переменную в Python

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

Доступ к глобальной переменной возможен из любой точки программы.

Вы можете использовать её внутри тела функции, а также получить к ней доступ извне функции:

# Создаем глобальную переменную
coding_website = "Pythonist"

def learn_to_code():
    # Используем переменную 'coding_website' внутри функции
    print(f"The best place to learn to code is with {coding_website}!")

# Вызываем функцию
learn_to_code()

# Используем переменную 'coding_website' вне функции
print(coding_website)

#output

#The best place to learn to code is with Pythonist!
#Pythonist

Что же происходит, когда есть глобальная и локальная переменные, и у них одинаковые имена?

# Глобальная переменная
city = "Athens"

def travel_plans():
    # Локальная переменная с тем же именем, что и у глобальной
    city = "London"
    print(f"I want to visit {city} next year!")

# Вызов функции. В выводе будет значение локальной переменной
travel_plans()

# Ссылка на глобальную переменную. В выводе будет значение глобальной переменной
print(f"I want to visit {city} next year!")

#output

#I want to visit London next year!
#I want to visit Athens next year!

Возможно, вы не ожидали, что код поведет себя таким образом. Вы могли думать, что значение переменной city изменится, когда мы присвоим ему другое значение внутри функции. Тогда при ссылке на глобальную переменную строкой print(f" I want to visit {city} next year!"), результатом было бы I want to visit London next year!, а не I want to visit Athens next year!. Однако при вызове функции она напечатала значение локальной переменной.

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

Тем не менее, использование одного и того же имени переменной для глобальных и локальных переменных не считается хорошей практикой. Следите за тем, чтобы ваши переменные не имели одинаковых имен. Иначе вы можете получить весьма непредсказуемые результаты при запуске вашей программы.

Как использовать ключевое слово global в Python

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

Посмотрите, что произойдет, если мы попытаемся это сделать следующим образом:

# Глобальная переменная
city = "Athens"

def travel_plans():
    # Это похоже на попытку доступа к глобальной переменной, определенной вне функции. 
    # Само по себе это работает прекрасно, как вы уже видели раньше.
    print(f"I want to visit {city} next year!")

    # Но когда мы пытаемся изменить значение глобальной переменной 'city' внутри функции
    # и затем вывести его,
    # выбрасывается ошибка
    city = "London"
    print(f"I want to visit {city} next year!")

# Вызов функции
travel_plans()

#output

#UnboundLocalError: local variable 'city' referenced before assignment

По умолчанию Python думает, что внутри функции вы хотите использовать локальную переменную.

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

Чтобы изменить значение глобальной переменной внутри функции, нужно использовать ключевое слово global. К примеру, это можно сделать следующим образом:

# Глобальная переменная
city = "Athens"

# Выводим значение глобальной переменной
print(f"I want to visit {city} next year!")

def travel_plans():
    global city
    # Выводим начальное значение глобальной переменной
    print(f"I want to visit {city} next year!")
    # Присваиваем глобальной переменной другое значение внутри функции
    city = "London"
    # Выводим новое значение
    print(f"I want to visit {city} next year!")

# Вызов функции
travel_plans()

# Выводим значение глобальной переменной
print(f"I want to visit {city} next year!")

Прежде чем ссылаться на глобальную переменную, нужно использовать ключевое слово global, иначе получите ошибку: SyntaxError: name 'city' is used prior to global declaration. Это значит, что вы попытались использовать переменную до того, как объявили её глобальной.

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

Ключевое слово global изменяет область видимости переменной, объявленной внутри функций. И тогда наш код будет работать следующим образом:

def learn_to_code():
   global coding_website
   coding_website = "Pythonist"
   print(f"The best place to learn to code is with {coding_website}!")

# Вызов функции
learn_to_code()

# Доступ к переменной вне функции
print(coding_website)

#output

#The best place to learn to code is with Pythonist!
#Pythonist

Заключение

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

Надеемся, что данная статья была для вас полезной. Спасибо за чтение и успехов в написании кода!

Перевод статьи «Python Global Variables – How to Define a Global Variable Example».

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

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

Давайте разберемся как создать и объявить глобальную переменную в Python и посмотрим примеры локальной и глобальной переменных.

Пример  локальной переменной:

 
# example of local variable 
def sum(): 
    a = 10   # local variables 
    b = 20 
    c = a + b 
    print("the sum is:", c) 
 
sum()  # function calling 

Выход:

The sum is: 30 

Объяснение:

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

Чтобы преодолеть эту проблему, мы используем глобальные переменные. Давайте разберемся в примере глобальной переменной.

Пример –

 
# example of a global variable 
a = 20   # defined outside the function 
b = 10 
 
def sum(): 
    c = a + b  # Using global variables 
    print("The sum is:", c) 
 
def sub(): 
    d = a - b   # using global variables 
    print("The sub is:", d) 
 
 
sum()  # function calling 
sub() 

Выход:

The sum is: 30 
The sub is: 10 

Объяснение:

В приведенном выше коде мы определили две глобальные переменные a и b вне функций. Мы использовали их внутри функций sum() и sub(). Обе функции вернули результат при вызове.

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

Пример 3:

 
def msg(): 
    m = "Hello, how are you?" 
    print(m) 
 
msg() 
m = "I am fine"  # global scope 
print(m) 

Выход:

Hello, how are you? 
I am fine 

Объяснение:

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

Глобальное ключевое слово

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

Правила глобальных ключевых слов:

  • Если значение определено на выходе функции, оно автоматически станет глобальной переменной или ее областью действия в глобальном масштабе.
  • Глобальное ключевое слово используется для объявления глобальной переменной внутри функции.
  • Нам не нужно использовать ключевое слово global для объявления глобальной переменной вне функции.
  • Переменные, на которые есть ссылка внутри функции, неявно являются глобальными.

Пример – без глобального ключевого слова:

 
# The example of without using the global keyword 
 
c = 10 
 
def mul(): 
 
    # Multiply by 10 
    c = c * 10 
    print(c) 
 
mul() 

Выход:

line 8, in mul 
    c = c * 10 
UnboundLocalError: local variable 'c' referenced before assignment 

Объяснение:

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

Пример – с глобальным ключевым словом:

 
# The example using the global keyword 
 
c = 10 
 
def mul(): 
    global c 
    # Multiply by 10 
    c = c * 10 
    print("The value inside function: ", c) 
 
mul() 
print('The value outside the function: ', c) 

Выход:

The value inside function:  100 
The value outside the function:  100 

В приведенном выше примере мы определили переменную c в функции mul() с помощью ключевого слова global. Значение c умножается на 10; следовательно, возвращается 200. Мы видим в выходных данных, что изменение значения внутри функции отражается на значении вне глобальной переменной.

Преимущество ключевого слова global заключается в создании глобальных переменных и совместном использовании их между различными модулями. Например, мы создаем name.py, который состоит из глобальных переменных. Если мы изменим эти переменные, то это изменение отразится повсюду. Давайте разберемся в следующем примере.

Код – 1: Создайте файл name.py для хранения глобальных переменных.

 
a = 10 
b = 20 
msg = "Hello World" 

Код – 2: Создайте файл change.py для изменения глобальных переменных.

 
import name 
name.a = 15 
name.b = 26 
name.msg = "Welcome to JavaTpoint" 

Здесь мы изменили значение a, b и msg. Эти глобальные переменные были определены в файле name.py, и мы импортировали name и получили доступ к этим переменным.

Код – 3: Создайте файл result.py для печати измененных глобальных переменных.

 
import name  
import change 
print(change.a)  
print(change.b)   
print(change.msg) 

Выход:

15 
26 
Welcome to JavaTpoint 

Ключевое слово global во вложенных функциях

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

Пример –

 
# The example of global in nested function 
 
def add(): 
    a = 15 
 
    def modify(): 
        global a 
        a = 20 
 
    print("Before modifying : ", a) 
    print("Making change") 
    modify() 
    print("After modifying: ", a) 
 
 
add() 
print("value of x: ", a) 

Выход:

Before modifying :  15 
Making change 
After modifying:  15 
value of x 20 

Объяснение:

В приведенном выше коде значение внутри add() принимает значение локальной переменной x = 15. В функции modify() мы присвоили x = 20 с помощью ключевого слова global. Это изменение отражено в переменной функции add().

Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.

Понравилась статья? Поделить с друзьями:

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

  • Как изменить переменную php через js
  • Как изменить пароль электронной почты на телефоне айфон
  • Как изменить переменную path linux
  • Как изменить пароль электронной почты на телефоне mail ru
  • Как изменить переменную css через js

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии