我是一个相当新的python程序员,在迭代链表时遇到了麻烦。这是一个链表,作为我正在使用的其他一些软件的输出提供给我(我没有修改的能力),并包含我需要访问的参数(仅在此处my_parameter调用以供参考)。作为参考,我将链表命名为sim_table。我用来尝试迭代的代码片段是:
sim_table_rows = []
def iterate_linked_list(node):
while node is not None:
sim_table_rows.append(node.my_parameter)
node = node.next
iterate_linked_list(sim_table)
这在 ipython 中工作正常,这是我测试所有内容的地方,但是当我尝试在 ipython 之外运行脚本时,我不断遇到分段错误:11。为了诊断问题,我尝试打印输出而不是附加它:
def iterate_linked_list(node):
while node is not None:
print node.my_parameter
node = node.next
iterate_linked_list(sim_table)
我得到的输出是列表中最后一个节点的my_parameter的无限循环,但我不确定为什么。我还做了一个只有两个节点的测试sim_table,看看如果我尝试迭代到 ipython 中不存在的节点会发生什么:
In [10]: test_sim_table.next.next.my_parameter
AttributeError: 'NoneType' object has no attribute 'my_parameter'
所以我得到一个属性错误而不是 None,这是我所期望的。我错过了一些简单的东西吗?我对这一切都很陌生,所以很可能。感谢您的任何帮助!
在哪里前进过链表,也许你想要:
sim_table_rows = []
def iterate_linked_list(node):
while node is not None:
sim_table_rows.append(node.my_parameter)
node = node.NEXT_NODE # Change node to next one...
假设 NEXT_NODE
是包含对下一个节点的引用的属性。
我认为这是因为您输入的第一个节点不是None
. 它永远不会None
,因为您在 while 循环中不断测试同一节点。
它类似于这个无限循环:
while True:
# do something
您似乎也在递归地解析链表。
也许:
sim_table_rows = []
def iterate_linked_list(node):
if node.next is None: # reached end of linked list
sim_table_rows.append(node.my_parameter) # add last value of liist #to the list
return sim_table_tows # returns full linked list
else:
sim_table_rows.append(node.my_parameter) # append to linked list
return iterate_linked_list(node.next) # run again with the next node as input
可能是您的链表被引用自身的节点终止。
def iterate_linked_list(node):
if node is not None: # non-empty list?
while True:
print node.my_parameter
if node.next is node: # end of list?
break
node = node.next
好吧,我从来没有一个完整的原因,但显然这个 seg 错误的根源与我尝试访问的链表是使用 SWIG 绑定生成的这一事实有关。我想这个问题以前已经被比我更聪明的同事看到过,它与我们用来生成数据的软件发行版特别相关。为了解决这个问题,我设法做的是:
sim_table_rows = []
while True:
sim_table_rows.append( [ node.parameter1, node.parameter2 ] )
if node.next is None: break
node = node.next
parameter1_types = [sim_table_rows[jj][0] for jj in range( len( sim_table_rows ) )]
parameter2_types = [sim_table_rows[jj][1] for jj in range( len( sim_table_rows ) )]
在这里,node是链表,我之前使用外部软件在脚本中定义了它。如果我尝试做更多的事情,我仍然会遇到 seg 错误,所以我只是按原样使用它(将适用于我的目的,尽管它可能比需要的更笨重)。
感谢所有有用的意见和建议!