Цикл for в функции работает только один раз

недавно стал программировать на питоне. Решил сделать задачу на палиндром, цель задачи в том чтобы программа с помощью цикла фор удаляла из списка букв слова одну букву и проверяла получается ли из этого слова палиндром.Почему то цикл работает только одну итерацию и дальше не хочет.Программа немного не доработана.

def OneToPalindrome(obj):
    for letter in obj:
        popped = obj
        popped.pop(obj.index(letter))
        revobj = popped[-1::-1]
        if revobj == obj:
            print('True')
            break
        else:
            revobj.clear()
            popped.clear() 
            #здесь будет счетчик итераций

OneToPalindrome(obj = list(input().lower()))

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

Автор решения: Глеб

Можно так:

>>> def one_to_palindrome(lst):
        for i in range(len(lst)):
            lst2 = lst[:]
            lst2.pop(i)
            if lst2 == lst2[::-1]:
                return True
        return False

>>> one_to_palindrome(list('aaab'))
True
>>> one_to_palindrome(list('hudsfdsii'))
False

→ Ссылка
Автор решения: Stanislav Volodarskiy

Судя по коду вы предполагаете что popped = obj создаёт копию списка. Это не так: обе переменные ссылаются на один и тот же список. Когда позже вы удаляете символ, исходный список портится, дальнейшая работа не имеет смысла.

Если исправить на popped = obj[:], то будет копирование. Тогда вылезет ошибка в if revobj == obj:. Сравниваются строки разной длинны, равенства не будет никогда.

Если исправить на if revobj == popped:, то заработает. Тогда вылезет ошибка в popped.pop(obj.index(letter)). Всегда будет удалятся первая буква из нескольких одинаковых. Это явно не то что вам нужно.

Можно перебирать индексы вместо букв. Получится что-то такое:

def OneToPalindrome(obj):
    for i in range(len(obj)):
        popped = obj[:]
        popped.pop(i)
        revobj = popped[-1::-1]
        if revobj == obj:
            print('True')
            break
        else:
            revobj.clear()
            popped.clear() 
            #здесь будет счетчик итераций

OneToPalindrome(obj = list(input().lower()))

P.S. Если вы доведете решение до ума, то получится квадратичная сложность. Задачу можно решить намного быстрее, за линейное время.

→ Ссылка