Почему значение моего логического значения не изменяется во время цикла?

#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 как? Для меня это такая запутанная строка кода