使用tkinter.after重复调用函数是否会导致栈溢出?
为什么tkinter的
after()不会引发栈溢出? 首先得搞清楚普通递归和after()调度的本质区别:
普通递归的问题:当你写
def func(): func()这类递归时,函数在执行过程中直接调用了自己,前一次的函数调用还没执行完(没从调用栈里弹出),新的调用又压入栈中。每一次调用都会在栈里占用一块空间,次数多了自然就会触发栈溢出。after()的工作逻辑:master.after(10000, update_data)这句话,并不是让当前函数直接调用update_data,而是给tkinter的主事件循环发送一个“延迟任务”。当前的update_data函数执行完所有逻辑后,会正常退出并从调用栈中消失。等10秒时间到了,主循环才会从任务队列里取出这个任务,重新调用update_data——这是一次全新的函数调用,和上一次的调用栈完全无关,栈不会被层层堆叠。
举个直观的代码对比:
普通递归(会栈溢出)
def recursive_func(): print("递归调用") recursive_func() # 直接调用自己,当前函数未结束 recursive_func()
tkinter的after方式(不会栈溢出)
import tkinter as tk def update_data(): print("更新数据") root.after(10000, update_data) # 告知主循环10秒后再调用,当前函数先结束 root = tk.Tk() update_data() root.mainloop()
简单来说,after()是调度式的“伪递归”,并非真正的函数递归调用,它不会让调用栈持续增长,自然也就不会出现栈溢出的问题。
内容的提问来源于stack exchange,提问作者chr15
相关产品推荐
相关产品推荐

