Понимание проблемы скрытия имен в Python – объяснение на примерах

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

Метод 1: затенение переменных

x = 10
def my_function():
    x = 20
    print(x)  # Output: 20
my_function()
print(x)  # Output: 10

В этом примере переменная xопределена как глобально, так и локально внутри функции my_function(). Когда мы вызываем my_function(), он печатает значение локального x(20), но вне функции глобальный xпо-прежнему остается доступен и сохраняет исходное значение (10).

Метод 2. Скрытие встроенных функций

sum = 10
def calculate_sum(a, b):
    sum = a + b
    return sum
result = calculate_sum(5, 7)
print(result)  # Output: 12
total = sum([1, 2, 3, 4, 5])
print(total)  # Raises TypeError: 'int' object is not callable

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

Метод 3. Скрытие атрибутов класса

class MyClass:
    x = 10
    def my_method(self):
        x = 20
        print(x)  # Output: 20
obj = MyClass()
obj.my_method()
print(obj.x)  # Output: 10

В этом примере у нас есть класс MyClassс атрибутом класса xи метод my_method(), который определяет локальную переменную

код>x. Когда мы вызываем my_method()в экземпляре MyClass, он печатает значение локального x(20), но обращается к obj.xпо-прежнему возвращает нам исходное значение атрибута класса (10).