Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分段错误:在python中迭代链表时出现11次错误_Python_Linked List - Fatal编程技术网

分段错误:在python中迭代链表时出现11次错误

分段错误:在python中迭代链表时出现11次错误,python,linked-list,Python,Linked List,我是python的新程序员,在遍历链表时遇到了麻烦。这是一个链表,作为我正在使用的其他一些软件(我无法修改)的输出提供给我,其中包含我需要访问的参数(此处仅称为我的_参数以供参考)。为了便于参考,我将链表命名为sim_表。我尝试迭代的代码片段是: sim_table_rows = [] def iterate_linked_list(node): while node is not None: sim_table_rows.append(node.my_parameter

我是python的新程序员,在遍历链表时遇到了麻烦。这是一个链表,作为我正在使用的其他一些软件(我无法修改)的输出提供给我,其中包含我需要访问的参数(此处仅称为我的_参数以供参考)。为了便于参考,我将链表命名为sim_表。我尝试迭代的代码片段是:

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_参数的无限循环,但我不知道为什么。我还制作了一个只有两个节点的测试sim_表,以查看如果我尝试迭代到ipython中不存在的节点会发生什么:

In [10]: test_sim_table.next.next.my_parameter
AttributeError: 'NoneType' object has no attribute 'my_parameter'

所以我得到了一个属性错误,而不是一个都没有,这正是我所期望的。我错过了一些简单的东西吗?我对这一切都很陌生,所以可能吧。谢谢你的帮助

不知道你在链表中的位置,也许你想要:

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\u 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绑定生成的这一事实有关。我猜这个问题以前被saavier比我的同事看到过,它与我们用来生成数据的软件发行版特别相关。为了解决这个问题,我做了以下几点:

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 ) )]
这里,节点是链表,我在前面的脚本中使用外部软件定义了它。 如果我尝试做更多的事情,我仍然会遇到seg故障,所以我只是按原样使用它(这对我来说是可行的,尽管它可能比需要的更笨重)


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

如果节点不是
None
,那么您将进入一个无限循环,附加第一个元素。。。不,在链接列表中,你应该在这里找到一个
MemoryError
,而不是一个segfault。但是,如果您收到的链表来自C扩展模块,那么这类模块很容易出现错误,导致它们在内存不足的情况下崩溃。我不太确定是否要在那里递归—如果需要递归,也许
if
应该替换
,而
?好吧,我已经尝试过了,这有点奇怪。对于我的一个示例链表,它只有两个节点,它可以正常工作并返回我想要的python列表。但是当我在一个完整的链表(有数百个或数千个节点)上尝试它时,我得到:RuntimeError:超过了最大递归深度。我会给你找个更好的solution@user2888465试试看,让我知道是否有什么不对劲嗯。。。也尝试了一下,得到了一个分段:11个错误。据我所知,这是与内存有关的seg故障?