python - 这条线是如何在 python 中执行的?
问题描述
我正在编写一个递归函数,它在单链表中交换对。在函数中有这一行可以正常工作:
head.next.next, head.next = head, head.next.next
但是,如果我将顺序切换为这样:
head.next, head.next.next = head.next.next, head
我得到一个RecursionError: maximum recursion depth exceeded
错误。
两条线有什么区别?解释器如何执行它们?
谢谢!
解决方案
不同之处在于,在第二个中,head.next
is 在head.next.next
评估之前重新分配,因此第二个分配目标(head.next).next
使用第一个分配的结果 to head.next
。
优秀的Python Tutor 工具可用于可视化代码运行时发生的情况,这可能有助于您理解:我使用数字 1、2、3 的列表运行每段代码;下图显示了列表的初始状态:
这是第一个代码之后的结果;请注意,我创建了另一个对 Node(2) 的引用,否则它将丢失:
这是重新初始化链表并运行第二个代码后的结果;再次,我创建了另一个对 Node(2) 的引用以防止它丢失:
我们可以看到第二个代码创建了一个循环,因此列表不再有结束。这意味着任何尝试遍历列表的递归算法都不会终止,除非溢出调用堆栈。
推荐阅读
- ruby-on-rails - 在 postgresql rails 中输入长度大于 255
- performance - Modelica中非线性求解器的仿真速度
- pandas - Pandas .agg() 删除列(lambda 函数)
- c++ - c ++ .exe和.dll在.exe中使用相同的全局变量?
- ios - 使用原始类型 CGRect 创建枚举
- django - 如何在其 docker 容器中执行 psql 交互?
- java - 添加@SpringBootTest注解后无法加载ApplicationContext
- android - 从 url 下载 PDF 文件并存储在内部存储中,然后尝试从任何 PDF 阅读器打开它,它的显示文件格式在颤振中不受支持
- python - 列表中单词的二进制分类器
- android - 如何通过editText增加计数器?