分段错误:11 来自在 python 中迭代链表



我是一个相当新的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 错误,所以我只是按原样使用它(将适用于我的目的,尽管它可能比需要的更笨重)。

感谢所有有用的意见和建议!

相关内容

  • 没有找到相关文章

最新更新