Есть ли способ вызвать переменную без ее объявления - PullRequest
0 голосов
/ 06 августа 2020

Я изучаю курс структур данных и алгоритмов. Есть викторина, в которой меня просят написать несколько кодов, описывающих тип связанного списка:

class LinkedList(object):
def __init__(self, head):
    self.head = head

def append(self, new_element):
    current = self.head
    if self.head:
        while current.next:
            current = current.next
        current.next = new_element
    else:
        self.head = new_element

Приведенный выше код - это пример, который курс сделал для меня. Но есть кое-что, чего я не понимаю в "while current.next" l oop, ясно, что переменная "current.next" не была объявлена. Я исследовал «следующую» вещь, но это касается только метода next (). Вот курс, если вам интересно: https://classroom.udacity.com/courses/ud513/lessons/7117335401/concepts/78875247320923

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Атрибут .next должен предоставляться тем, что вы передаете при построении связанного списка и добавлении к нему объектов.

Вот очень простой c пример того, как это может работать

class LinkedList(object):
  def __init__(self, head):
      self.head = head

  def append(self, new_element):
      current = self.head
      if self.head:
          while current.next:
              current = current.next
          current.next = new_element
      else:
          self.head = new_element

  #added for demonstration
  def output_values(self):
    current = self.head
    while current:
      print(current.value)
      current = current.next

class LinkedObject:
  next = None
  value = None
  def __init__(self, val=None, nextObject=None):
    if nextObject:
      self.next = nextObject
    if val:
      self.value = val
  
ll = LinkedList(LinkedObject(5))

ll.append(LinkedObject(24))
ll.append(LinkedObject(332))

ll.output_values()
0 голосов
/ 06 августа 2020

Сопряжение в вашем коде текущее устанавливается с помощью переменной self.head, которая была передана конструктору. Поэтому при вызове функции, поскольку она может быть вызвана только из экземпляра, она всегда будет установлена. В вашем примере они ожидают, что head будет связанным списком.

Итак, вкратце. Ваша интерпретация полностью неверна. current всегда будет установлен, и поскольку мы ожидаем, что текущий список будет связанным списком, он будет иметь свойство next. При вызове current.next вы получите возвращаемое значение. Если есть другой элемент, он go перейдет к следующему, если получено None (No Element), он установит следующий элемент.

Единственное, что не имеет смысла, это проверка того, установлен ли self.head как функция принадлежит экземпляру, и единственный конструктор требует установки head. Возможно, лучше проверьте Тип self.head.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...