Оболочка Python зависает при достижении определенного метода, который проверяет наличие элементов в списке

#python #list

#python #Список

Вопрос:

У меня есть метод, который должен определять, находится ли определенное значение внутри списка, если значение есть в списке, оно вернется True , а False если нет. Когда программа достигает этого метода, оболочка просто пуста.

Я попытался изменить elif инструкции и перейти построчно, чтобы увидеть, в чем может быть проблема. Я протестировал метод, просто вернув True, и программа работает нормально.

 class advisor(person):
    def __init__(self, name):
        self.name = name

    def approveSelectedCourse(self, finishedCourses, theClass):
        if theClass in finishedCourses:
            return False
        elif theClass is 213:
            if 110 in finishedCourses:
                return True
            else:
                return False
        elif theClass is 412:
            if 316 in finishedCourses:
                return True
            else:
                return False

class student(person):
    def __init__(self, name, stuID, finishedCourses, selectedCourses):
        person.__init__(self, name)
        self.stuID = stuID
        self.selectedCourses = selectedCourses
        self.finishedCourses = finishedCourses
 

Результат должен возвращать True, если конкретный класс находится внутри списка finishedCourses .

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

1. Знаете ли вы размер «списка»? (примечание: вы можете return 110 in finishedCoures вместо elif

2. Не используйте is , когда вы действительно имеете в виду == .

3. if theClass отсутствует в finishedCourses списке и отличается от 213 , и 412 функция вернет a None , потому что вы не обработали этот случай

Ответ №1:

Вы используете is то, что имеете в виду == ; нет никакой гарантии, что theClass , например, переменная и литерал 412 ссылаются на один и тот же объект, представляющий 412 .

 >>> theClass = 412
>>> theClass is 412
False
>>> theClass == 412
True
 

Тот факт, что это верно для 213

 >>> theClass = 213
>>> theClass is 213
True
 

является следствием конкретной оптимизации, используемой реализацией CPython (и, возможно, другими) для небольших целых чисел, а не языковой гарантией.

 def approveSelectedCourse(self, finishedCourses, theClass):
    if theClass in finishedCourses:
        return False
    elif theClass == 213:
        if 110 in finishedCourses:
            return True
        else:
            return False
    elif theClass == 412:
        if 316 in finishedCourses:
            return True
        else:
            return False
 

который можно упростить до

 def approveSelectedCourse(self, finishedCourses, theClass):
    if theClass in finishedCourses:
        return False
    elif theClass == 213:
        return 110 in finishedCourses
    elif theClass == 412:
        return 316 in finishedCourses