Первое значение в глобальном списке как-то обновляется внутри функции? - PullRequest
0 голосов
/ 18 октября 2018

По какой-то причине первое значение в списке x обновляется, но больше ничего в списке не обновляется.Я запутался, так как x является глобальной переменной и обновляется только в функции замены.Программа работает, если я переопределить x между операторами печати.Я прокомментировал это, как будто это небрежное решение.

x = [1,3,2,4,2,1,1,2,2,1] 

def REPLACE(new,old,x):
    if str(old) not in str(x):
        return x
    elif x[0] == old:
        x[0] = new
        return x[0:1] + REPLACE(new,old,x[1:])
    else:
        return x[0:1] + REPLACE(new,old,x[1:])


print(REPLACE(10,1,x))
#x = [1,3,2,4,2,1,1,2,2,1]
print(REPLACE(1,3,REPLACE(1,3,x)))

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы меняете его значение в функции ЗАМЕНА.поскольку вы формируете новый список, вам не нужно это делать.Просто прочитайте х, не меняя его.

x = [1,3,2,4,2,1,1,2,2,1] 

def REPLACE(new,old,x):
    if str(old) not in str(x):
        return x
    elif x[0] == old:
        return [new] + REPLACE(new,old,x[1:])
    else:
        return x[0:1] + REPLACE(new,old,x[1:])


print(REPLACE(10,1,x))
print(REPLACE(1,3,REPLACE(1,3,x)))
0 голосов
/ 18 октября 2018

В вашей функции REPLACE единственный оператор, который изменяет x, это:

x[0] = new

, который изменяет только первый элемент x, тогда как:

return x[0:1] + REPLACE(new,old,x[1:])

создает срезы x, которые являются новыми экземплярами списка, поэтому дальнейшие изменения срезов не будут отражены в исходном x.

Если вы собираетесь сделать эту функцию одновременно, измените x ивернуть результат, оставаясь рекурсивным, вместо этого вы можете использовать индекс в качестве параметра:

def REPLACE(new, old, x, i=0):
    if i >= len(x):
        return x
    if x[i] == old:
        x[i] = new
    return REPLACE(new, old, x, i + 1)
...