首页 > 解决方案 > 这条线是如何在 python 中执行的?

问题描述

我正在编写一个递归函数,它在单链表中交换对。在函数中有这一行可以正常工作:

head.next.next, head.next = head, head.next.next

但是,如果我将顺序切换为这样:

head.next, head.next.next = head.next.next, head

我得到一个RecursionError: maximum recursion depth exceeded错误。

两条线有什么区别?解释器如何执行它们?

谢谢!

标签: python

解决方案


不同之处在于,在第二个中,head.nextis 在head.next.next评估之前重新分配,因此第二个分配目标(head.next).next使用第一个分配的结果 to head.next

优秀的Python Tutor 工具可用于可视化代码运行时发生的情况,这可能有助于您理解:我使用数字 1、2、3 的列表运行每段代码;下图显示了列表的初始状态:

初始状态

这是第一个代码之后的结果;请注意,我创建了另一个对 Node(2) 的引用,否则它将丢失:

代码 1

这是重新初始化链表并运行第二个代码后的结果;再次,我创建了另一个对 Node(2) 的引用以防止它丢失:

代码 2

我们可以看到第二个代码创建了一个循环,因此列表不再有结束。这意味着任何尝试遍历列表的递归算法都不会终止,除非溢出调用堆栈。


推荐阅读