#python #python-3.x #while-loop #boolean
#python #python-3.x #цикл while #логическое
Вопрос:
В моей книге по алгоритмам есть реализация связанного списка на Python с различными методами. Это remove
метод, но я не до конца понимаю while
цикл.
Эта реализация опирается на Node
класс, который был ранее определен, класс имеет такие методы get.data()
, как get.next()
, set_next()
, и т.д. Сам список является вызываемым классом UnorderedList
. self.head
относится к первому элементу в списке.
Идея этого remove
метода заключается в том, чтобы перемещаться по списку, пока мы не найдем элемент, который мы хотим удалить. Мы создаем a current
и a previous
, чтобы отслеживать текущий элемент, который мы просматриваем, и тот, который был раньше.
Мой вопрос связан с циклом while. Мы устанавливаем found
значение False
с намерением изменить его, когда найдем искомый элемент. Однако разве цикл while не изменит значение found
to True
, когда мы скажем not found
?
Я знаю, что это простой вопрос, но мне трудно понять, почему и как работает этот цикл while, поскольку в моей голове not
обычно логическое значение в его области действия противоположно тому, что оно есть. Кто-нибудь может мне это объяснить?
кстати, мне не нужно никаких объяснений или улучшений текущего кода, это пример из книги, и все это имеет смысл для меня, я просто хочу понять эту часть.
def remove(self, item):
current = self.head
previous = None
found = False
while not found:
if current.get_data() == item:
found = True
else:
previous = current
current = current.get_next()
if previous == None:
self.head = current.get_next()
else:
previous.set_next(current.get_next())
Комментарии:
1.
not found
не изменяет значениеfound
. Он считывает значениеfound
и выдает вам противоположное.2. @khelwood вот откуда моя путаница. поскольку
found
установлено значениеFalse
, моя интуиция заключается в том, что этоnot found
даст мнеTrue
и что цикл перестанет выполняться. но это явно не так, так почему же это так? Единственное, к чему я могу это приравнять, это когда вы создаете переменную, а затем говоритеif variable
, и это возвращаетсяTrue
, потому что вы в основном проверяете, существует ли переменная, и, ну, это так. Это то же самое, что происходит здесь?3. @TomServo Я был бы благодарен, если бы вы могли подсказать мне, как использовать отладчик для этого. Я самоучка и на самом деле не использую отладчик. Итак, чтобы ответить на ваш вопрос, я, любопытный парень-самоучка, пытающийся изучить алгоритмы, у меня нет отладчика 🙂
Ответ №1:
Похоже, я упустил часть смысла того, что пытался сделать цикл while. Действительно, выражение not found
означает, что выражение вычисляется True
, но в данном случае это не останавливает цикл. Он делает именно то, что мы хотим, он продолжает выполнять цикл. Как только мы находим искомый элемент, мы меняем значение found
на быть True
. В этот момент, когда мы оцениваем while not found
, это даст False
результат, что выведет нас из цикла.
Ответ №2:
not found
используется как условное в цикле while, а не как оператор, который изменяет значение. Вы можете прочитать while not found
как while found == False
Комментарии:
1.в этом есть смысл. Я просто нахожу это запутанным, потому что, если я скажу
not False
, что это дастTrue
результат, верно? итак, я думаю, такfound = False
not found
как должно бытьTrue
? Похоже ли это на то, если бы я только что сказалif found
, что это будет равноTrue
? но потому, что я говорюnot found
, что оно оцениваетсяFalse
как? Для меня это такая запутанная строка кода