有时候会打印出无 - 有时它没有打印,不能解释为什么?

时间:2016-05-06 18:43:02

标签: python

我得到了这个学校作业,这是我的代码:

class Doubly_linked_node():
    def __init__(self, val):
        self.value = val
        self.next = None
        self.prev = None

    def __repr__(self):
        return str(self.value)

class Deque():
    def __init__(self):
        self.header = Doubly_linked_node(None)
        self.tailer = self.header
        self.length = 0

    def __repr__(self):
        string = str(self.header.value)
        index = self.header
        while not (index.next is None):
            string+=" " + str(index.next.value)
            index = index.next
        return string


    def head_insert(self, item):
        new = Doubly_linked_node(item)

        new.next=self.header
        self.header.prev=new

        self.header=new
        self.length+=1

        if self.tailer.value==None:
            self.tailer = self.header

    def tail_insert(self, item):
        new = Doubly_linked_node(item)

        new.prev=self.tailer
        self.tailer.next=new

        self.tailer=new
        self.length+=1

        if self.header.value==None:
            self.header = self.tailer

它构建一个堆栈,允许您添加和删除头部或尾部的项目(我没有包括所有代码只有重要的东西)。

当我发起一个对象时,如果我返回self.next它会打印None,但是如果我返回self.prev,它就不会打印,只是跳过,我不明白为什么两者都定义与你看到的完全相同,如果我只插入头几次,例如for i in range(1,5): D.head_insert(i),然后我打印D它打印5 4 3 2 1 None但是如果我做尾插入例如{ {1}}并打印for i in range(1,5): D.tail_insert(i),在没有D的情况下打印1 2 3 4 5"。这是为什么?

我收录了一张图片:

image

3 个答案:

答案 0 :(得分:1)

  1. 请注意,您创建的Deque不是空的。您正在使用值为None

  2. 的节点对其进行初始化
  3. 您正在交换value和Node对象。当您查看if self.tailer.value==None:时,它可能不是您的意思

  4. 点2之后是对空Deque的特殊处理,其中标题和尾标为None

  5. 如果我要实施Deque,请注意以下内容。我稍微更改了__repr__的返回值。

    class Deque():
        def __init__(self):
            self.header = None
            self.tailer = None
            self.length = 0
    
        def __repr__(self):
            if self.header is None:
              return 'Deque<>'
            string = str(self.header.value)
            index = self.header.next
            while index!=None:
                string+=" " + str(index.value)
                index = index.next
            return 'Deque<'+string+'>'
    
        def head_insert(self, item):
            new = Doubly_linked_node(item)
    
            new.next=self.header
            if self.length==0:
              self.tailer=new
            else:
              self.header.prev=new
    
            self.header=new
            self.length+=1
    
        def tail_insert(self, item):
            new = Doubly_linked_node(item)
    
            new.prev=self.tailer
            if self.length==0:
              self.header=new
            else:
              self.tailer.next=new
    
            self.tailer=new
            self.length+=1
    

答案 1 :(得分:1)

根据Günthers的建议,我已将__repr__修改为:

def __repr__(self):
    string = str(self.header.value)
    index = self.header
    while not (str(index.next) == "None"):
        string += (" " + str(index.next.value))
        index = index.next
    return string

确实解决了这个问题,但这是我见过的最丑陋的解决方案。

有没有人知道更好的方法?

答案 2 :(得分:0)

关于更好的__repr__方法的问题,我的建议。使用Deque方法扩展__iter__类。所以你可以迭代Deque,这很好,例如:

for item in D:
  print item

基于此__repr__方法很简单。这是整个变化:

def __repr__(self):
  return 'Deque<'+' '.join([str(item.value) for item in self])+'>'

def __iter__(self):
  index=self.header
  while index is not None:
    yield index.value
    index=index.next