首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python中的递归函数看起来超出了作用域,但事实并非如此。我错过了什么?

在Python中,递归函数的执行确实可能会看起来超出了函数的作用域,但实际上并非如此。这是因为Python中的递归函数是通过栈(stack)来实现的。

当一个函数被调用时,会创建一个称为函数帧(function frame)的数据结构,用于存储函数的局部变量、参数和返回地址等信息。每个函数帧都被依次压入栈中,形成一个调用栈。

在递归函数中,当函数调用自身时,会创建一个新的函数帧并压入栈中。递归函数会不断地创建新的函数帧,直到达到递归终止条件。然后,从调用栈的顶部开始依次弹出函数帧,并执行相应的操作。

虽然递归函数中的函数帧看起来超出了函数的作用域,但实际上它们是通过栈来管理的,每个函数帧在栈中都有自己的位置。当函数执行完毕后,对应的函数帧会被从栈中弹出,然后程序回到上一个函数帧继续执行。

由于递归函数是通过栈来实现的,因此递归的深度可能受到Python解释器对栈大小的限制。如果递归层数过多,可能会导致栈溢出错误(Stack Overflow Error)。

总结起来,递归函数在Python中并没有超出作用域的问题,而是通过栈来管理函数帧。这是Python中实现递归的一种方式。递归函数在某些问题的解决上具有简洁、优雅的特点,但需要注意递归深度的控制,以避免栈溢出错误的发生。

以下是腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云函数(Serverless):提供按需执行代码的计算服务,无需管理服务器。了解更多:https://cloud.tencent.com/product/scf
  • 腾讯云弹性容器实例(Elastic Container Instance):快速部署容器化应用的计算服务,提供高可用、弹性伸缩的容器运行环境。了解更多:https://cloud.tencent.com/product/eci
  • 腾讯云轻量应用服务器(Cloud Run):无服务器容器化运行环境,支持自动扩缩容,可运行任意语言的应用程序。了解更多:https://cloud.tencent.com/product/sf
  • 腾讯云云托管(CloudBase):基于云原生架构的全托管 PaaS 平台,支持多种语言和框架,提供便捷的部署和运维能力。了解更多:https://cloud.tencent.com/product/tcb
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python基础教程

也就是说函数本身被返回了,但并没有被调用。重要的是返回的函数还可以访问它的定义所在的作用域。换句话说,它“带着”它的环境(和相关的局部变量)。 每次调用外层函数,它内部的函数都被重新绑定。...由于Python的嵌套作用域,来自(`multiplier的)外部作用域的这个变量,稍后会被内层函数访问: >>> double = multiplier(2) >>> double(5) 10 >>>...函数从参数中得到需要的信息,也就是函数调用时设定的变量。Python中有两类参数:位置参数 和 关键数参数。参数在给定默认值时是可选的。 作用域。变量存储在作用域(也叫作命名空间)中。...Python有两类主要的作用域——全局作用域 和 局部作用域。作用域可以嵌套。 递归。 函数可以调用自身即递归。一切用递归实现的功能都能用循环实现,但是有些时候递归函数更易读。 函数式编程。...但并不是所有Python程序员都知道类的定义其实就是执行代码块。 7.2.5 指定超类 子类可以拓展超类的定义。将其他类名写在class语句后的圆括号内可以指定超类。

76720

程序员必知的 Python 陷阱与缺陷列表

阅读字数:3754 | 10分钟阅读 我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段代码直接出错,抛出了异常,我不认为这是陷阱。...如果在modify_lst函数中print idx, item就可以发现端倪:lst在变短,但idx是递增的,所以在上面出错的例子中,当3被删除之后,6变成了lst的第2个元素(从0开始)。...问题的本质在与python中的属性查找规则,LEGB(local,enclousing,global,bulitin),在上面的例子中,i就是在闭包作用域(enclousing),而Python的闭包是...解决办法也很简单,那就是变闭包作用域为局部作用域。...但事实上可能掉进了一个陷阱,在python documnet是有描述的:   Circular references which are garbage are detected when the option

1.2K70
  • 程序员必知的 Python 陷阱与缺陷列表

    我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然”的方式。如果一段代码直接出错,抛出了异常,我不认为这是陷阱。...如果在modify_lst函数中print idx, item就可以发现端倪:lst在变短,但idx是递增的,所以在上面出错的例子中,当3被删除之后,6变成了lst的第2个元素(从0开始)。...问题的本质在与Python中的属性查找规则,LEGB(local,enclousing,global,bulitin),在上面的例子中,i就是在闭包作用域(enclousing),而Python的闭包是延迟绑定...解决办法也很简单,那就是变闭包作用域为局部作用域。 >>> def create_multipliers(): ......但事实上可能掉进了一个陷阱,在Python documnet是有描述的: Circular references which are garbage are detected when the option

    59340

    《Python基础教程》第六章--读书

    第六章:抽象 本章会介绍如何将语句组织成函数。还会详细介绍参数(parameter)和作用域(scope)的概念,以及递归的概念及其在程序中的用途。...如何将参数收集为元祖和字典已经讨论过了,但是事实上,如果使用*和**的话也可以执行相反的操作。...我记得在JS中时,也有类似知识点,会逐步向上搜索作用域链中的变量值。 那么该怎么达成效果呢?怎么避免被屏蔽呢?使用globals函数获取全局变量值!...因为x作为形参,是局部变量,而函数里通过global又定义x是全局变量,因此出现了错误提示中的错误。 嵌套作用域(闭包) python的函数是可以嵌套的,也就是说可以将一个函数放在另一个里面。...外部作用域的变量一般是不能进行重新绑定的。但是python3中,nonlocal关键字被引入。它和global关键字的使用方式类似,可以让用户对外部作用域(但并非全局作用域)的变量进行赋值。

    72910

    python之抽象一

    函数的局部名称-----包括参数在内-----并不和外面的函数名称冲突。 1.为什么我想要修改参数 使用函数改变数据结构是将程序抽象化的好方法。...这是因为当调用foo的时候,新的命名空间就被创建了,它作用于foo内的代码块。赋值语句x=42只在内部作用域(局部命名空间)起作用,所以它并不影响外部作用域的x。函数内的变量被称为局部变量。...也就是说函数本身被返回了----但并没有被调用。重要的是返回的函数还可以访问它的定义所在的作用域,换句话说,它带着它的环境和相关的局部变量。...每次调用外层函数,它内部的函数都被重新绑定,factor变量每次都有一个新的值。由于Python的嵌套作用域,来自外部作用域的这个变量,稍后会被内层函数访问。...但是Python3.0中,nonlocal关键字被引入。它和global关键字的使用方式类似,可以让用户对外部作用域的变量进行赋值。 6.6 递归 递归的定义包括它们自身定义内容的引用。

    47610

    碾压 Python!为什么 Julia 速度这么快?

    Julia 中的数学运算 一般来说,Julia 中的数学运算与其他脚本语言中的数学运算看起来是一样的。...但实际上,Fibonacci 函数是用来测试递归的,而不是用来测试语言的执行速度的。...不免费的午餐 很明显,Julia 为了在保持脚本语言特征的同时实现性能目标,做出了非常明智的设计决策。但是,它也为此付出了一些代价。接下来,我将展示 Julia 的一些奇特的东西及其相应的工具。...REPL 的全局作用域性能很糟糕 Julia 全局作用域的性能很糟糕。官方的性能指南建议不要使用全局作用域。然而,新手可能会意识不到 REPL 其实就是全局作用域。为什么?...首先,Julia 是有嵌套作用域的。例如,如果函数内部有函数,那么内部函数就可以访问外部函数的所有变量。

    2.4K10

    干货 | 国外大神总结的10个Java编程技巧!

    前言 “任何可能出错的事情,最后都会出错。”这就是人们为什么喜欢进行“防错性程序设计”的原因。 偏执的习惯有时很有意义,有时则不够清晰也不够聪明,也许当你想到这样写的人的时候还会觉得有点怪异。...你觉得你写了一个超好的API,它真的是既酷炫又直观;接着就出现了一群用户,他们只是把一切类型生搬硬套进 Object 中 直到那该死的编译器停止工作,然后他们突然链接到了错误的方法,认为这一切都是你的错...不管怎样,我们既然无法摆脱 switch ,在必要的时候我们最好能够正确使用它,例如: ? 因为在当 value=3 被引入到软件中的时候,default 就能发挥作用,使其正常运行!...在switch语句中,为所有的case都只定义了一个作用域。事实上,这些case不是真正意义上的语句,他们更像是标签,而switch就是指向这些标签的goto语句。...看起来并不是很直观。我们可以通过添加简单的花括号为每一个case创建一个新的嵌套的作用域,当然不要忘了在每个 case 的语句块最后加 break。 文章来源:Java技术栈 文章编辑:小柳

    62610

    国外大神总结的 10 个 Java 编程技巧!

    这就是人们为什么喜欢进行“防错性程序设计”的原因。偏执的习惯有时很有意义,有时则不够清晰也不够聪明,也许当你想到这样写的人的时候还会觉得有点怪异。...你觉得你写了一个超好的API,它真的是既酷炫又直观;接着就出现了一群用户,他们只是把一切类型生搬硬套进 Object 中 直到那该死的编译器停止工作,然后他们突然链接到了错误的方法,认为这一切都是你的错...不管怎样,我们既然无法摆脱 switch ,在必要的时候我们最好能够正确使用它,例如: ? 因为在当 value=3 被引入到软件中的时候,default 就能发挥作用,使其正常运行!...在switch语句中,为所有的case都只定义了一个作用域。事实上,这些case不是真正意义上的语句,他们更像是标签,而switch就是指向这些标签的goto语句。...看起来并不是很直观。我们可以通过添加简单的花括号为每一个case创建一个新的嵌套的作用域,当然不要忘了在每个 case 的语句块最后加 break。

    2.3K20

    国外大神总结的 10 个 Java 编程技巧!

    这是一个国外大神20多年的经验总结出来的…… “任何可能出错的事情,最后都会出错。” 这就是人们为什么喜欢进行“防错性程序设计”的原因。...你觉得你写了一个超好的API,它真的是既酷炫又直观;接着就出现了一群用户,他们只是把一切类型生搬硬套进 Object 中 直到那该死的编译器停止工作,然后他们突然链接到了错误的方法,认为这一切都是你的错...不管怎样,我们既然无法摆脱 switch ,在必要的时候我们最好能够正确使用它,例如: ? 因为在当 value=3 被引入到软件中的时候,default 就能发挥作用,使其正常运行!...在switch语句中,为所有的case都只定义了一个作用域。事实上,这些case不是真正意义上的语句,他们更像是标签,而switch就是指向这些标签的goto语句。...看起来并不是很直观。我们可以通过添加简单的花括号为每一个case创建一个新的嵌套的作用域,当然不要忘了在每个 case 的语句块最后加 break。

    63820

    每周闲谈

    本期话题 你的地图是错的 (2010年,美国旧金山举行 Web 2.0 峰会。主办方在会上发布了一张《互联网地图》) 扎克伯格:"地图的最大部分一定是未知领域。...现在的这张地图让互联网世界看起来像零和游戏,但事实并非如此。我们正在开拓新疆域,创造价值,而不是从别人那里夺走它们。"...3、Python cheatsheet github.com/gto76/python-cheatsheet Python小抄,包含各种常用函数用法。...VSCode 插件,安装后鼠标移动到函数后,选择See Real World Examples From Github,可以查看函数(在github中的)真实用法。...你可能想像我一样非常擅长它,所以你排除了生活中的其他一切,以便掌握它。你不去洗手间,你有男子气概的10小时编程课程,你吃得不对,以及关于“真正的程序员”的各种神话信仰。事实是,真正的程序员是白痴。

    28920

    Python快速学习第七天

    值得注意的是,尽管可能使用的是新版的Python,但一些特性(比如属性和super函数)不会在旧式的类上起作用。...为什么super函数这么超级 在我看来,super函数比在超类中直接调用未绑定方法更直观。但这并不是它的唯一优点。...内部的具体工作原理不用理解,但必须清楚地知道:在大多数情况下,使用新式类和super函数是比调用超类的未绑定的构造方法(或者其他的方法)更好的选择。 那么,super函数到底返回什么?...☑ 如果序列的索引是正确的类型,但超出了范围,应该引发一个IndexError异常。...☑ 外部作用域访问生成器的send方法,就像访问next方法一样,只不过前者使用一个参数(要发送的“消息”——任意对象)。

    2.3K50

    Python面试常见问题集锦:基础语法篇

    本篇博客将聚焦Python基础语法,梳理面试中常见的问题、易错点,并提供实用的代码示例,帮助您在面试中展现出深厚的技术功底,从容应对挑战。 1....变量作用域与命名规则 问题示例: 描述Python中的变量作用域规则。 请解释什么是“LEGB”规则? 举个例子说明全局变量与局部变量的区别。...简而言之: Local:函数内部定义的变量,仅在该函数内部可见。 Enclosing(外层作用域):在嵌套函数中,内部函数可以访问外部函数(非全局)的变量。...**答案:**闭包是Python中一种特殊的函数,它记住了定义它的词法环境,即使在其外部作用域已经不存在时仍能访问那些变量。简单来说,闭包是由一个内部函数和其外部作用域(包括变量和参数)组成的整体。...函数工厂:闭包可以作为生成拥有特定初始状态的函数的工厂,便于创建多个相似但状态各异的函数实例。 问题7:如何在Python中创建匿名函数(lambda函数)?

    20210

    Python面试常见问题集锦:基础语法篇

    本篇博客将聚焦Python基础语法,梳理面试中常见的问题、易错点,并提供实用的代码示例,帮助您在面试中展现出深厚的技术功底,从容应对挑战。1....变量作用域与命名规则问题示例:描述Python中的变量作用域规则。请解释什么是“LEGB”规则?举个例子说明全局变量与局部变量的区别。...简而言之:Local:函数内部定义的变量,仅在该函数内部可见。Enclosing(外层作用域):在嵌套函数中,内部函数可以访问外部函数(非全局)的变量。...答案:闭包是Python中一种特殊的函数,它记住了定义它的词法环境,即使在其外部作用域已经不存在时仍能访问那些变量。简单来说,闭包是由一个内部函数和其外部作用域(包括变量和参数)组成的整体。...函数工厂:闭包可以作为生成拥有特定初始状态的函数的工厂,便于创建多个相似但状态各异的函数实例。问题7:如何在Python中创建匿名函数(lambda函数)?

    14010

    Python 作用域和命名空间

    在介绍类之前,我首先要告诉你一些Python的作用域规则。类定义对命名空间有一些巧妙的技巧,你需要知道作用域和命名空间如何工作才能完全理解正在发生的事情。...下面是几个命名空间的例子:存放Python内置函数的集合(包含 abs() 这样的函数,和内建的异常等);模块中的全局名称;函数调用中的本地名称。...(事实上,比起描述到底发生了什么,忘掉它更好。)当然,每次递归调用都会有它自己的本地命名空间。 一个 作用域 是一个命名空间可直接访问的 Python 程序的文本区域。...重要的是应该意识到作用域是按字面文本来确定的:在一个模块内定义的函数的全局作用域就是该模块的命名空间,无论该函数从什么地方或以什么别名被调用。...删除也是如此:语句 del x 会从局部命名空间的引用中移除对 x 的绑定。 事实上,所有引入新名称的操作都使用局部作用域:特别地,import 语句和函数定义会在局部作用域中绑定模块或函数名称。

    71650

    胡渊鸣:import一个“太极”库,让Python代码提速100倍!

    那么此时,计算所有小于1000万的素数就只耗时0.45s了,与原来的Python代码相比速度就提高了120倍! 厉不厉害? 什么?你觉得这个例子太简单了,说服力不够?我们再来看一个稍微复杂一点的。...最后,我们再来一个不一样的例子。 反应 - 扩散方程,效果惊人 自然界中,总有一些动物身上长着一些看起来无序但实则并非完全随机的花纹。 图灵机的发明者艾伦·图灵是第一个提出模型来描述这种现象的人。...如果Taichi中实现这个方程,首先创建网格来表示域,用vec2表示每个网格中U, V的浓度值。 拉普拉斯算子数值的计算需要访问相邻网格。...其实,Taichi就是一个嵌入在Python中的DSL(动态脚本语言),它通过自己的编译器将被 @ti.kernel 装饰的函数编译到各种硬件上,包括CPU和GPU,然后进行高性能计算。...当然,Taichi用起来和这些库以及其他加速方法有什么差别,胡渊鸣也给出了详细的优缺点对比,感兴趣的朋友可以戳下面的链接详细查看: https://docs.taichi-lang.org/blog/accelerate-python-code

    41420

    胡渊鸣:import一个“太极”库,让Python代码提速100倍!

    点击上方↑↑↑“OpenCV学堂”关注我来源:公众号 量子位 授权 众所周知,Python的简单和易读性是靠牺牲性能为代价的—— 尤其是在计算密集的情况下,比如多重for循环。...最后,我们再来一个不一样的例子。 反应 - 扩散方程,效果惊人 自然界中,总有一些动物身上长着一些看起来无序但实则并非完全随机的花纹。 图灵机的发明者艾伦·图灵是第一个提出模型来描述这种现象的人。...如果Taichi中实现这个方程,首先创建网格来表示域,用vec2表示每个网格中U, V的浓度值。 拉普拉斯算子数值的计算需要访问相邻网格。...其实,Taichi就是一个嵌入在Python中的DSL(动态脚本语言),它通过自己的编译器将被 @ti.kernel 装饰的函数编译到各种硬件上,包括CPU和GPU,然后进行高性能计算。...当然,Taichi用起来和这些库以及其他加速方法有什么差别,胡渊鸣也给出了详细的优缺点对比,感兴趣的朋友可以戳下面的链接详细查看: https://docs.taichi-lang.org/blog/accelerate-python-code

    1K30

    可爱的 Python:Python 中的函数编程

    本文讨论了函数编程的常规概念,并说明了在 Python 中实现函数技术的方法。 我们最好从最难的问题开始:“到底什么是函数编程 (FP)?”...虽然列表内涵没有添加什么新的能力,但它们使许多旧的能力看起来好了 许多。  Python 中 FP 的基本元素是函数 map()、reduce() 和 filter(),以及运算符 lambda。...消除副作用在除去完美的、有意义的语句不用而代之以晦涩的、嵌套的表达式的工作后,一个很自然的问题是:“为什么?!”我对 FP 的所有描述都是使用 Python 做到的。...很明显,可以使用函数/实例形式的封装和有关作用域的考虑来防止出现这种类型的错误。而且,您总是可以在执行完变量后 del 它们。但在实际中,这些指出类型的错误非常普遍。 ...因为 functional 模块本身完全是用 Python 编写的,所以它所做的在 Python 本身中已经可能存在。但 Keller 也指出了一组非常紧密集成的扩展,简洁定义中带有许多能力。

    91120

    偏执却管用的10条Java编程技巧

    这就是人们为什么喜欢进行“防错性程序设计”的原因。偏执的习惯有时很有意义,有时则不够清晰也不够聪明,也许当你想到这样写的人的时候还会觉得有点怪异。...不要相信“-1” 我知道这很偏执,Javadoc中关于 String.indexOf() 的早期描述是这样的… “字符在字符序列中第一次出现的位置将作为结果[被返回],如果字符不存在则返回-1。...你觉得你写了一个超好的API,它真的是既酷炫又直观;接着就出现了一群用户,他们只是把一切类型生搬硬套进 Object 中 直到那该死的编译器停止工作,然后他们突然链接到了错误的方法,认为这一切都是你的错...Remember: default: throw new ThreadDeath("That'll teach them"); } 在switch语句中,为所有的case都只定义了一个作用域...看起来并不是很直观。我们可以通过添加简单的花括号为每一个case创建一个新的嵌套的作用域,当然不要忘了在每个 case 的语句块最后加 break。

    76370

    3 Python 基础: Python函数及递归函数知识点梳理

    [wuvnko3x53.png] [hkl9qcih5t.png] 3、全局变量与局部变量 什么是作用域 Python中一个变量的是在一定的范围内起作用的,在其起作用的这个范围我们称之为作用域。...全局变量与局部变量两者的本质区别就是在于作用域 用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用...理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 使用递归函数需要注意防止栈溢出。...可以试试fact(1000): [agr0ljcrx9.png] 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。...小结 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。 针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。

    1.1K60
    领券