Говоря о функциях, правильно рассуждать о том чтобы она получала какие-то данные и возвращала какие-то данные. Однако, в некоторых случаях мы можем изменить что-либо внутри функции и это будет иметь последствия для кода снаружи, даже не присваивая ее результат.
Рассмотрим следующий пример, как думаете, какой будет результат?
class Test:
def __init__(self):
self.number = 5
number = 5
class_number = Test()
def modify(number: int, class_number Test, number_from_class: int):
number = 1
class_number.number = 2
number_from_class = 3
modify(number, class_number, class_number.number)
print(number, class_number.number)
Правильный ответ — «5 2». Изменив атрибут у объекта класса внутри функции, которой мы передали этот объект, он поменяется и снаружи, так как объекты обычных классов являются изменяемыми объектами. Остальные переменные не поменяли своего значения снаружи, так как число и многие другие типы являются неизменяемыми. Когда вы выполняете присваивание number = 1
внутри функции modify
, это создает новую переменную
в локальной области видимости функции, которая скрывает глобальную переменную number
number
. Это изменение видимо только внутри функции.
Возможно это сразу очевидно многим, но я даже не задумывался о таком, пока сам не споткнулся.