SyntaxError: name 'Num1' is parameter and global

Не получается сделать переменую Num1 внутри под функции sum глобальной. При исрользовании global или nonlocal выдаёт ошибку. Ошибка в том, что в фунции sum параметр Num1 не изменяется в глобальной фрейме. И я не знаю как это исправить.

def plus1(Num1,Num2,base):
    Num_Tab = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-/8=~!@#№$%^&?'
    New_Num = ''
    Num1 = Num1[::-1]
    Num2 = Num2[::-1]
    a = min(len(Num1),len(Num2))
    i = 0
    if len(Num1) < len(Num2):
        Num1, Num2 = Num2, Num1
        Dif = True
    else:
        Dif = False
    def sum(Num1, Num2):
        x = Num_Tab.find(Num1[i],0,base) + Num_Tab.find(Num2[i],0,base)
        if x > base:
            Num1 =  Num1[:i] + Num_Tab[Num_Tab.find(Num1[i+1]) + 1] + Num1[i+1:]
            return Num_Tab[x-base] 
        else:
            return Num_Tab[x]
    while a:
        D = sum(Num1, Num2)
        a-=1
        New_Num = New_Num + D 
        i+=1 
    if Dif:
        while i != max(len(Num1),len(Num2)):
            New_Num =  Num1[i] + New_Num
            i+=1
    return New_Num[::-1]
>>> plus1('123','391',10)

414 Хотя должен выдать 514


Ответы (1 шт):

Автор решения: CrazyElf
  1. Никогда не называйте свои функции так же, как называются встроенные объекты или функции Python - потом сюрприз будет. Назвать свою функцию sum - это плохая идея.

  2. Старайтесь не писать функции "с побочным эффектом". Функции должны делать по возможности всё в явном виде. Если функция меняет какой-то объект - пусть она возвращает его и вы легко можете присвоить результат работы функции в объект снаружи функции. В Python при этом, в отличие от некоторых других языков, очень легко вернуть из функции любое количество объектов. И также легко присвоить произвольное число значений в переменные одной строкой.

Так что сделайте, например, так:

def str_sum(Num1, Num2):
    ...
    Num1 = ...
    result = ...
    return result, Num1

res, Num1 = str_sum(Num1, Num2)

И сразу отпадает надобность в корявом использовании global.

Думаю, этого достаточно для начала.

→ Ссылка