Что произойдёт, если в функции объявить переменную как `global`, но внутри другой функции попытаться изменить её значение без использования `global`?

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


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

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

По сути, произойдет "затенение" (shadowing) глобальной переменной. При обращении к переменной внутри второй функции без global будет использоваться именно локальная переменная, а глобальная останется неизменной.

Пример:

        
        global_var = 10

        def func_global():
            global global_var
            global_var = 20  # Изменяет глобальную переменную

        def func_local():
            global_var = 30  # Создает ЛОКАЛЬНУЮ переменную global_var

        print(f"Глобальная переменная до изменений: {global_var}")  # Выведет 10

        func_global()
        print(f"Глобальная переменная после func_global(): {global_var}")  # Выведет 20

        func_local()
        print(f"Глобальная переменная после func_local(): {global_var}")  # Выведет 20 (НЕ 30, так как func_local работала с локальной переменной)
        
    

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

0