локальная переменная ‘statement’, на которую ссылаются перед присвоением

#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 to True перед циклом. На самом деле, вы могли бы выполнить, 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 Я не понимаю вашего последнего комментария, но я думаю, что на самом деле это все равно другой вопрос.