AttributeError: объект NoneType не имеет атрибута ''

Я работал с двусвязными списками в Python, когда столкнулся с этой ошибкой:

    def merge(self,other):
        mergedCenter = HealthCenter()
        selfPatient = self._head
        otherPatient = other._head
        print(selfPatient.elem)
        print(selfPatient.elem < otherPatient.elem)
        while (selfPatient or otherPatient):
            if selfPatient.elem < otherPatient.elem:
                mergedCenter.addLast(selfPatient.elem)
                selfPatient = selfPatient.next
            elif selfPatient.elem > otherPatient.elem:
                mergedCenter.addLast(otherPatient.elem)
                otherPatient = otherPatient.next
            else:
                mergedCenter.addLast(selfPatient.elem)
                selfPatient = selfPatient.next
                otherPatient = otherPatient.next
        return (mergedCenter)

Я получаю этот вывод:

Abad, Ana   1949    True    0
True
Traceback (most recent call last):
  File "main.py", line 189, in <module>
    hc3 = hc1.merge(hc2)
  File "main.py", line 112, in merge
    if selfPatient.elem < otherPatient.elem:
AttributeError: 'NoneType' object has no attribute 'elem'

Уже реализован метод для сравнения .elem, как вы можете ясно видеть на втором принте, но я не понимаю, почему в первом условном условии он продолжает ломаться.

Заранее спасибо.

Решение: Необходимо было учитывать длину обоих DLlist, чтобы не получить одно из обоих значений 'Nonetype'. Это решается заменой OR на AND и последующей проверкой того, какой из них не является «Nonetype», чтобы завершить слияние


person FrugalCoder    schedule 02.04.2021    source источник
comment
В какой-то момент один из ваших .next вызовов возвращает None   -  person OneCricketeer    schedule 02.04.2021
comment
selfPatient или otherPatient — нет.   -  person John Gordon    schedule 02.04.2021
comment
Ваше условие while проверяет только, если хотя бы один узел не равен None. Используйте and вместо or, чтобы проверить оба.   -  person MisterMiyagi    schedule 02.04.2021
comment
Укажите ожидаемый MRE — минимальный воспроизводимый пример. Покажите, где промежуточные результаты отличаются от ожидаемых. Мы должны иметь возможность вставить один блок вашего кода в файл, запустить его и воспроизвести вашу проблему. Это также позволяет нам тестировать любые предложения в вашем контексте. Мы ожидаем, что вы, по крайней мере, просмотрите сообщение об ошибке и попытаетесь отследить ошибочные значения в вашей программе.   -  person Prune    schedule 02.04.2021


Ответы (1)


Это проверяет, являются ли они отличными от None, поэтому, если один, а не другой, вводится цикл

while (selfPatient or otherPatient)

Если вы хотите получить доступ к обоим атрибутам elem, тогда оба должны быть отличными от None, что потребует от вас изменить or на and

В противном случае вам нужна отдельная логика перед операторами if для обработки, когда только один из них равен None, а затем, возможно, разорвет цикл, чтобы был достигнут возврат. И все же не мешало бы обернуть остальную часть существующей логики в if selfPatient and otherPatient, так как вы используете атрибуты из обоих

Что касается того, почему один становится None, это зависит от вашей логики повторения связанных списков.

person OneCricketeer    schedule 02.04.2021
comment
Полностью верно. Затем я должен проверить, является ли selfPatient или otherPatient None, и завершить слияние. Спасибо всем - person FrugalCoder; 02.04.2021