2016-10-25 3 views
0

я в настоящее время создания цикла в то время как питон, и я получил эту проблему:локальная переменная «оператор» обращаться до присвоения

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 

Я беспокоюсь, если я initialize statement = True before while statement, потому что он может стать бесконечным циклом

Например, это данные Task.objects:

id name  next 
001 task1 002 
002 task2 003 
003 task3 000 

Я хотел бы получить Id корневой задачи, которая должна быть 001

+1

Если вы можете получить бесконечный цикл на этом, то вы, вероятно, должны исправить **, что ** проблема с вашей связанной ведомой вещью DB –

+6

_ «Я волнуюсь, если я инициализирую оператор = Истинное до того времени, потому что оно может стать бесконечным петля "_ - Почему вы так думаете? Предполагая, что ваши условия для нарушения контроля из вашего цикла верны, вы не получите бесконечный цикл. Похоже, что реальная проблема кроется с остальной частью вашего кода. _ ** Начать там ** _ –

+2

Абсолютно ничего плохого в объявлении '' '' '' True' перед циклом. На самом деле вы могли бы сделать «while True:», а затем «break» выйти из цикла, когда условие выполняется в цикле. Вам просто нужно подумать о том, что происходит внутри цикла, и убедиться, что он выйдет из него **:) ** – BorrajaX

ответ

2

Комментарии уже указывают вам ответ, но вот (более Pythonic) способ закодировать следующим образом:

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 не существует, но, как правило, плохо иметь голый, catch-all, except.

+0

Я делаю некоторые связанные списки здесь, и моя цель - получить этот headNode. –

+0

, но это только дает мне первый lastNode.id, где следующий - settings.EMPTY_UUID –

+0

@JamesReid Я не понимаю ваш последний комментарий, но я думаю, что это вообще другой вопрос. – Evert

Смежные вопросы