Проблема с затенением имен, определенных во внешних областях видимости в 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).