Статья

Как передать переменную по ссылке в Python?

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

Возвращение кортежа

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}
Почти никогда не бывает веской причины, чтобы все так усложнять.

Лучший вариант из представленных – это вернуть кортеж, содержащий несколько возвращаемых значений.
python