为什么我要输出两次?

时间:2017-02-05 08:38:35

标签: python eclipse python-3.x pydev

在这里提出这个问题,因为前一个问题已经结束:https://stackoverflow.com/questions/41315555/traversing-a-linked-list-getting-the-output-twice

更新:我使用的是Python 3.6,Eclipse Neon.2版本(4.6.2)(32位)和PyDev 5.5

我创建了两个类,Node.py和UnorderedList.py。

Node.py如下:

class Node:
    #constructor
    def __init__(self,initdata):
        self.data = initdata
        self.next = None

    def hasNext(self):
        return self.next != None

UnorderedList.py:

class UnorderedList:   
    def __init__(self):
        self.head = None
        self.last = None

    def append(self,data):  
        temp = Node(data)
        if(self.head == None):
            self.head = temp
            self.last = self.head
        else:
            self.last.next = temp
            self.last = self.last.next

    def traverse(self):
        current= self.head
        while current != None:
            print(current.data)
            current = current.next

我正在测试它,使用以下代码:

ul = UnorderedList()
ul.append(1)
ul.append(2)
ul.traverse() 

当我在一个Python脚本中插入两个类并运行代码时,输​​出正如预期的那样:

1
2

然而,

  1. 我将这两个类放在不同的模块中,采用以下包结构,
  2. Package structure

    1. 将导入行放在UnorderedList.py:

      之上
      import py_linked_lists.Node as Node
      
    2. 按如下方式对append()进行更改:

      def append(self,data):
          temp = Node.Node(data)
          #rest all code remains same
      
    3. 运行代码,输出两次:

      1
      2
      1
      2
      
    4. 更新: 我在https://stackoverflow.com/questions/41315555/traversing-a-linked-list-getting-the-output-twice的评论中尝试了这些建议,并使用if __name__ == "__main__"成功阻止输出两次出现 保护块,如下所示,在UnorderedList.py中:

      if __name__ == "__main__":
      
          ul = UnorderedList()
          ul.append(1)
          ul.append(2)
          ul.traverse()
      

      输出:

      1
      2
      

      感谢@Blckknght。

      正如我在此处的答案What does if __name__ == "__main__": do?中看到的那样,如果我不使用if __name__ == "__main__",我从Node导入的py_linked_lists.Node类也会被执行。

      我无法理解的是Node.py的执行如何影响输出,当没有这样的代码时,只有一个类结构存在。

1 个答案:

答案 0 :(得分:1)

我得到了答案,从@ nitind的评论中得到了启示。 我在__init__.py的{​​{1}}中有以下内容:

py_linked_lists

我从https://stackoverflow.com/a/448311/4515198了解到,每次在包中运行模块时都会加载包import py_linked_lists.UnorderedList as UnorderedList

在这种情况下,__init__.py的{​​{1}}将在执行模块__init__.py之前加载。因此,在作为模块执行之前,模块py_linked_lists已从UnorderedList.py加载为导入。因此,我得到了两次输出。

要确认,我在UnorderedList.py中添加了以下内容:

__init__.py

输出:

UnorderedList.py

明确指出,if __name__ == "__main__": print("Name is",__name__) ul = UnorderedList() ul.append(1) ul.append(2) ul.traverse() else: print("Name is",__name__) print("UnorderedList also being imported") print("---------------------------------") 第一次已加载,如下所示 来自Name is py_linked_lists.UnorderedList UnorderedList also being imported --------------------------------- Name is __main__ 1 2 导入,因此UnorderedList.py等于__init__.py,因此__name__部分已执行。

然后,模块py_linked_lists.UnorderedList被加载为模块,因此else等于UnorderedList.py__name__部分已执行,证明上面的输出。