在这里提出这个问题,因为前一个问题已经结束: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
然而,
时将导入行放在UnorderedList.py:
之上import py_linked_lists.Node as Node
按如下方式对append()进行更改:
def append(self,data):
temp = Node.Node(data)
#rest all code remains same
运行代码,输出两次:
1
2
1
2
更新:
我在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
的执行如何影响输出,当没有这样的代码时,只有一个类结构存在。
答案 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__
部分已执行,证明上面的输出。