【问题标题】:python recursive variables referenced or copied?python递归变量引用或复制?
【发布时间】:2018-03-17 07:46:41
【问题描述】:

我有以下递归函数,但我无法弄清楚 python 如何处理递归函数中的变量。它会为每次递归创建addresses 变量的副本,还是会覆盖该变量并造成可怕的混乱?

def get_matches():
    addresses = get_addresses()

    #do stuff

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

【问题讨论】:

  • 作用域不同,变量不同。
  • addresses 是一个局部变量...
  • @erip scope 是我在 Google 搜索中缺少的神奇词,谢谢!
  • 一般来说,name addresses 存在于递归的每个作用域(或框架)中。但是,如果 get_addresses() 被定义为返回单个可变 object,那么 name 无关紧要,因为所有帧都将引用同一个 object 。我们在 Python 中一般不谈论 变量,而是谈论 namesobjects
  • 在这里试试pythontutor.com,然后你会看到

标签: python recursion


【解决方案1】:

您寻找的下划线概念称为框架

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

这意味着即使对于函数的每次递归调用,都会为该特定函数调用创建一个新框架并将其压入堆栈。正如我上面已经说过的,每个框架都有自己的范围。因此,每个帧的作用域都定义了一个 address 变量,与其他任何变量分开。

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

【讨论】:

  • 鉴于问题的简单性,最好提一下大多数现代编程语言使用堆和堆栈来将变量的值存储在内存中(可能链接到 this 之类的东西,例如参考)。
  • @Darthfett 是的,你的权利。我将进行编辑以澄清这一点。
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 2017-02-03
  • 2020-11-08
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
相关资源
最近更新 更多