В Питоне аргументы функций передаются путем присваивания. Поскольку присваивание просто создает новые ссылки на объекты, то между именами аргумента в вызывающем и вызываемом методе нет общей ссылки.
Как же передать аргумент по ссылке? Вы можете добиться нужного эффекта несколькими способами.
Возвращение кортежа
def my_func(x, y):
# x и y локальные имена, которым присвоены новые объекты
x = 'новое значение'
y = y + 1
# возвращаем новые значения
return x, y
a, b = 'старое значение', 9
a, b = my_func(a, b)
print(a, b)
результат: новое значение 10
Это почти всегда самое ясное решение.
Использование глобальных переменных
Использование глобальных переменных не рекомендуется, т. к. не потокобезопасно.
Передача изменяемого (mutable) объекта
def func1(a):
# 'a' ссылается на изменяемый список
a[0] = 'новое значение'
a[1] = a[1] + 1
args = ['старое значение', 9]
func1(args)
print(args)
результат: ['новое значение', 10]
Передача словаря
def func2(args):
# args - изменяемый словарь
args['a'] = 'новое значение'
args['b'] = args['b'] + 1
args = {'a': 'старое значение', 'b': 9}
func2(args)
print(args)
результат: {'a': 'новое значение', 'b': 10}
Передача экземпляра класса
class MyNamespace:
def __init__(self, /, **args):
for key, value in args.items():
setattr(self, key, value)
def func3(args):
args.a = 'новое значение'
args.b = args.b + 1
args = Namespace(a='старое значение', b=9)
func3(args)
vars(args)
результат:
{'a': 'новое значение', 'b': 10}
Почти никогда не бывает веской причины, чтобы все так усложнять.
Лучший вариант из представленных – это вернуть кортеж, содержащий несколько возвращаемых значений.
Лучший вариант из представленных – это вернуть кортеж, содержащий несколько возвращаемых значений.