我有以下递归函数,而且我无法弄清楚python如何处理递归函数中的变量。它会为每次递归创建addresses
变量的副本,还是会覆盖变量并造成可怕的混乱?
def get_matches():
addresses = get_addresses()
#do stuff
for addr in addresses:
#do stuff
if some_condition:
get_matches()
else:
return
答案 0 :(得分:4)
您要查找的下划线概念称为 框架 。
Python解释器内部是一个通常称为调用堆栈的堆栈。每次Python在执行期间遇到函数调用时,都会创建一个新的框架对象并将其推送到堆栈上。该帧表示函数调用。每个人都有自己的范围,以及传递给函数的任何参数的当前值。
这意味着即使对于函数的每次递归调用,也会为该特定的函数调用创建一个新帧并将其推送到堆栈上。正如我上面已经说过的,每个框架都有它自己的范围。所以每个框架都是'范围中定义了address
变量,与其他变量分开。
但请注意,框架对象本身不存储变量的值。你看,Python解释器只在堆栈的最顶层框架上运行。 Python使用与调用堆栈分开的另一个堆栈来存储它当前正在执行的帧的局部变量的值。