Связанный список Python — нетипичная ошибка в рекурсивной функции удаления

#python

#питон

Вопрос:

Я изучаю Python и работаю над созданием односвязного класса list. Все конструкторы классов, функции добавления и отображения работают, но при попытке реализовать рекурсивную функцию удаления я обнаруживаю, что либо список вообще не изменяется, либо он полностью удаляется. Добавление операторов print в рекурсивную функцию, которые предназначены для печати значения узла, генерирует нетипичные ошибки атрибута, которые наводят меня на мысль, что у меня может возникнуть проблема с передаваемыми аргументами, поскольку объект, который я считаю узлом, по-видимому, нет. Я рассмотрел другие нетипичные вопросы, которые я нашел в SE, но либо они не пролили необходимого света, либо я просто неправильно их понял. Определения классов:

 class Node:
    def __init__(self, value):
        self.data = value
        self.next_node = None
        
class List:
    def __init__(self):
        self.head = None
 

Удаление функций:

 def remove(self, target):
     if(self.head == None):
          print("List is empty!")
          return None
     else:
          print(str(self.head.data))
          self.head = self.remove_target(self.head, target)
          return self.head
        
def remove_target(self, head, target):
     print("Target: "   str(target)   "Head: "   str(head.data)) #Nonetype errors occur here
     if(head == None):
          return head
     if(head.data == target):
          print("target found")
          head = head.next_node
          return head
     else:
          head.next_node = self.remove_target(head.next_node, target)
          return head
 

Мой предыдущий опыт программирования был на c , и я думаю, что часть проблемы заключается в том, что функции-оболочки, используемые для скрытия элементов данных в c , на самом деле не используются в Python? Однако те же результаты возникают, когда я вызываю рекурсивную функцию непосредственно из тестовой программы. Любой свет, который может быть пролит, был бы очень признателен!

Комментарии:

1. Код в вопросе должен демонстрировать хотя бы один сбой.

2. Я добавил некоторый тестовый код вокруг него самостоятельно. Я не знаю, совпадает ли это с вашим. Я тоже изменил отступ. Я получил «цель найдена», но тогда вы не предпринимаете никаких попыток изменить список вокруг точки удаления. Вы просто сбрасываете весь список и назначаете остаток после точки удаления в качестве нового заголовка — поэтому это все, что останется. Я оставлю это как упражнение по отладке для вас.

3. Для простоты я бы предложил использовать только ОДИН класс ( Node в вашем случае). Это то, что я делал в прошлом. Если вам нужен какой-то код для этого, пожалуйста, дайте мне знать!

4. Хм. Является ли передача по ссылке или передача по значению соответствующей концепцией в Python? У меня возникли небольшие проблемы с осмыслением того, как это должно работать без указателей, которых, как я понимаю, здесь нет?