2017-10-05 69 views
4

我有以下的递归函数,我很难找出python如何处理递归函数中的变量。它会为每个递归创建一个addresses变量的副本,还是会覆盖该变量并创建一个可怕的混乱?python递归变量引用或复制?

def get_matches(): 
    addresses = get_addresses() 

    #do stuff 

    for addr in addresses: 
     #do stuff 
     if some_condition: 
      get_matches() 
     else: 
      return 
+6

不同的范围,不同的变量。 – erip

+0

'addresses'是一个局部变量... –

+0

@erip范围是我在Google搜索中失踪的魔法词,谢谢! – jamzsabb

回答

4

的下划线上的概念,你要找的是称为框架

Python解释器的内部是一个栈,通常被称为调用栈。每次在执行过程中遇到函数调用时,都会创建一个新的框架对象并将其推送到堆栈中。该框架表示函数调用。每个人都有自己的范围,以及传递给函数的任何参数的当前值。

这意味着即使对于函数的每次递归调用,也会为该特定的函数调用创建一个新帧并将其推送到堆栈上。正如我上面所说的,每一帧都有自己的范围。所以每个框架的范围都有一个定义在其中的变量address,与其他变量分开。

但请注意,帧对象本身不存储变量的。你看,Python解释器只能在堆栈的最顶层框架上运行。 Python使用与调用堆栈分开的另一个堆栈来存储当前正在执行的帧的局部变量的值。

+0

考虑到问题的简单性,最好提一下,大多数现代编程语言使用堆和堆栈来存储内存中的变量值(可能链接到[this](http:// net-informations)。 com/faq/net/stack-heap.htm),以供参考)。 – Darthfett

+0

@Darthfett是的,你的权利。我会编辑来澄清这一点。 –