#python #django
#python #django
Вопрос:
В настоящее время я создаю цикл while в python, и у меня возникла эта проблема:
local variable 'statement' referenced before assignment
это мой код:
while (statement == True):
self.headNode = settings.EMPTY_UUID
try:
lastNode = Task.objects.get(next = self.headNode)
self.headNode = lastNode.id
statement = True
except:
statement = False
Я беспокоюсь, не инициализирую ли я statement = True перед операцией while, потому что это может стать бесконечным циклом
Например, это данные Task.objects:
id name next
001 task1 002
002 task2 003
003 task3 000
Я хотел бы получить идентификатор корневой задачи, который должен быть 001
Комментарии:
1. если вы можете получить бесконечный цикл для этого, то вам, вероятно, следует исправить эту проблему с помощью вашего связанного списка DB
2. «Я беспокоюсь, не инициализирую ли я statement = True перед операцией while, потому что это может превратиться в бесконечный цикл» — Почему вы так думаете? Предполагая, что ваши условия для вывода управления из вашего цикла верны, вы не получите бесконечный цикл. Похоже, настоящая проблема связана с остальной частью вашего кода. Начните с этого
3. Нет абсолютно ничего плохого в объявлении
statement
toTrue
перед циклом. На самом деле, вы могли бы выполнить,while True:
а затемbreak
выйти из цикла, когда в цикле выполняется условие. Вам просто нужно подумать о том, что происходит внутри цикла, и убедиться, что это выйдет из него 🙂4. Ошибка находится над вашим циклом while. Убедитесь, что оператор определен независимо от пути, по которому выполняется код.
Ответ №1:
Комментарии уже указывают вам на ответ, но вот (более питонический) способ закодировать это:
while True:
self.headNode = settings.EMPTY_UUID
try:
lastNode = Task.objects.get(next=self.headNode)
self.headNode = lastNode.id
break
except Task.DoesNotExist:
break
Даже если вам понадобится значение statement
после цикла while, вам не нужна переменная: statement
очевидно False
, что в этот момент.
Обратите внимание, что я также изменил except
инструкцию. Я предполагаю, что вы хотите перехватить ошибку, которая возникает, когда соответствующий Task
объект не существует, но обычно плохо иметь голый, универсальный, except .
Комментарии:
1. Я делаю здесь несколько связанных списков, и моя цель — получить этот headNode.
2. но это дает мне только первое lastNode.id где следующим являются настройки. EMPTY_UUID
3. @JamesReid Я не понимаю вашего последнего комментария, но я думаю, что на самом деле это все равно другой вопрос.