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

为什么我的python变量在递归过程中是全局行为的?

在Python中,变量的作用域是根据其定义的位置来确定的。当在函数内部定义一个变量时,它默认是局部变量,只在该函数内部可见。但是,在递归过程中,每次递归调用都会创建一个新的函数执行上下文,包括局部变量的新实例。

然而,如果在递归函数内部没有重新定义同名的变量,Python会尝试在当前函数的作用域中查找该变量。如果找不到,则会继续在上一层函数的作用域中查找,直到找到该变量或者到达全局作用域。这种行为被称为变量的作用域链。

因此,在递归过程中,如果没有在函数内部重新定义同名的变量,Python会沿着作用域链查找该变量,并在全局作用域中找到它。这就是为什么你的Python变量在递归过程中表现为全局行为的原因。

需要注意的是,虽然变量在递归过程中表现为全局行为,但这并不意味着你可以直接修改全局变量。如果你想在递归函数中修改全局变量,需要使用global关键字来声明该变量为全局变量。

以下是一个示例代码,说明了在递归过程中变量的作用域行为:

代码语言:txt
复制
def recursive_function(n):
    if n <= 0:
        print("End")
    else:
        print("Current value:", n)
        recursive_function(n-1)

# 调用递归函数
recursive_function(3)

输出结果为:

代码语言:txt
复制
Current value: 3
Current value: 2
Current value: 1
End

在这个例子中,变量n在递归过程中表现为全局行为,每次递归调用都会使用上一次调用的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

全局变量 Python应用场景

Python中,全局变量程序全局范围内定义变量,可以整个程序中访问。...虽然Python中使用全局变量并不像在其他编程语言中那样被推荐,因为它可能导致代码不易理解和维护,但在一些特定情况下,全局变量仍然有用。...1、问题背景 Python 中使用 Tkinter 库创建 GUI 时,有时会遇到 "button1 is not defined" 错误。这可能由于函数中使用了在其他函数中定义变量。...全局变量 Python应用场景有很多,例如,可以用来函数之间共享数据。然而,使用全局变量也存在一些弊端,例如,容易导致代码难以维护和调试。因此,使用全局变量时,需要权衡利弊。...总的来说全局变量某些情况下很方便,但过度使用全局变量可能会导致代码可维护性下降。主要是因为,在编写Python代码时,应尽量减少对全局变量使用,而是更多地采用函数参数和返回值来传递数据。

10810

有趣 Python 特性 1 | 谁吃掉了外部变量

本文字数:1240 字 阅读本文大概需要:4 分钟 写在之前 Python 提供了很多让使用者觉得舒服至极功能特性,但是随着不断深入学习和使用 Python发现其中存在着许多玄学输出与之前预想结果大相径庭...,这个对于初学者来说难以理解,但是在理解它们以后又会觉得这么有意思,所以我准备了这个「有趣 Python 特性」系列,写一些碰到或看到一些你所不知道「奇葩」,这里面会涉及到 Python2...和 Python3 中异同,希望大家能从学习过程中体会到真正乐趣。...这也变相告诉我们,如果想要在 except 后面引用 e,必须将它先赋值给其它变量。 这样看来,变量 e 执行了 except 子句而被删除,但是为什么 e 会去执行 except 子句呢?...答案是否定,其实这个是因为子句 Python 中没有独立作用域,所以上述示例中所有内容都处于同一个作用域里,所以变量 e 会因为执行了 except 子句而被删除。

43510

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

写在def语句中函数名后面的变量通常叫做函数形参(parameter),而调用函数时候提供实参(argument)或者成为参数。 能改变参数吗?...,因此,全局变量就被屏蔽了(如果不重复,可以读取到全局变量)。...记得JS中时,也有类似知识点,会逐步向上搜索作用域链中变量值。 那么该怎么达成效果呢?怎么避免被屏蔽呢?使用globals函数获取全局变量值!...因为x作为形参,局部变量,而函数里通过global又定义x全局变量,因此出现了错误提示中错误。 嵌套作用域(闭包) python函数可以嵌套,也就是说可以将一个函数放在另一个里面。...外部作用域变量一般不能进行重新绑定。但是python3中,nonlocal关键字被引入。它和global关键字使用方式类似,可以让用户对外部作用域(但并非全局作用域)变量进行赋值。

70110

python函数

上面的代码中old_price,new_price这些就是全局变量,他比局部变量有更大权限,它作用域整个代码,真个模块,但是我们修改全局变量时候也要注意,如果在函数内部修改全局变量python...值: 50 打折后价格: 80.0 这里试图打印修改后全局变量old_price值: 100.0 全局变量函数内部中可以访问,但是我们不要试图去修改一个全局变量,因为python会使用屏蔽...python会创建一个和全局变量一样变量,并把它设置为局部变量。但是如果我们想要去修改全局变量,可以实现吗,答案肯定。...:因为执行return Fun2()时候,那么他就会跑到Fun2里面去执行,整个Fun1内部空间,x=5,它属于Fun2中全局变量,但是对于整个代码来说,他一个局部变量,其实x=5是非全局变量外部变量...;Fun2中x和Fun1中x不是一个变量,和之前全局变量和局部变量中讲到一样,python函数中定义一个全局变量python通过shadowing方式来屏蔽掉这个全局变量,创建一个和全局变量相同变量

1.7K10

python之day3(文件操作、字符转

程序按顺序执行,所以定义函数、过程最好放在最前面 例子程序1: 定义函数中可以调用全局变量。...print("after change",name) name="alex"       #name为全局变量,整个程序中都生效 change_name(name) print(name)   #打印结果仍为全局变量值...局部变量默认无法改全局变量内容,除非使用global强制声明,如:globalname 例子程序2: 列表、字典、集合、类子程序即函数中修改局部变量就会影响全局变量,如: def change_name...'] 当全局变量与局部变量重名时,定义局部变量子程序内,局部变量起作用,在其他程序中全局变量起作用。...8、 递归函数内部,可以调用其它函数,如果一个函数在内部调用自身,这个函数就是递归函数。

60860

Python学习(三)---- 集合、文件操作、字符编码和函数

字符编码与转码 3.1 Python编码详解 为什么我们要加“#-*- coding:utf-8 -*-”这一行?意思置顶编码类型为utf-8编码!...存储英文时候我们至少需要1个字节(一个字母),就是8位(bit),看下ASCII表中1个字节就可以表示所有的英文所需要字符,不非常高效! 为什么呢?早期计算机空间是非常宝贵!...全局与局部变量 子程序中定义变量称为局部变量程序一开始定义变量称为全局变量全局变量作用域整个程序,局部变量作用域定义该变量子程序。...顶级都是全局变量,函数中变量修改,函数中加global 变量名不应该在函数里改全局变量,因为来回调用,就乱了。 列表、字典、集合可以函数中修改。...4.4 返回值 函数执行过程中只要遇到return语句,就会停止执行并返回结果 如果未在函数中指定return,那这个函数返回值为None ? 4.5 递归 函数内部,可以调用其他函数。

55120

一个函数自白

高阶与递归有啥区别? 回调和匿名一回事么? 对象中方法么? 控制对象行为方式有哪些呢? 为什么说类型错误只是异常处理一种方式? 面对数据密集型应用和并发场景,有何作用?...作为过程函数一般用全局变量来共享状态,我会改变或增加共享状态。过程函数可能不是幂等,而缺乏幂等性被很多人认为编程错误一个来源。...而且,采用全局变量也一直被认为一个馊主意,然而在系统层面,架构中组件共享其实和全局变量类似,这让有时候感到无语。...需要注意python中并不对尾递归进行优化,一般要对调用深度进行限制。 下一个自动调用——回调和匿名 忽如一夜春风来,千树万树梨花开。...所有现代高级编程语言都有一个类型系统,开发和执行过程中不同节点检测数据类型。静态类型语言如Java 和 Haskell,动态类型如JS,python等等。

75750

python函数

---恢复内容开始--- 一 数学定义函数与python函数 初中数学函数定义:一般一个变化过程中,如果有两个变量x和y,并且对于x每一个确定值,y都有唯一确定值与其对应,那么我们就把...自变量x取值范围叫做这个函数定义域 例如y=2*x python中函数定义:函数逻辑结构化和过程化一种编程方法。...,python解释器会隐式返回None, 所以python中即便是过程也可以算作函数。...3.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定) 4.默认参数 5.参数组 五 局部变量全局变量 子程序中定义变量称为局部变量程序一开始定义变量称为全局变量...全局变量作用域整个程序,局部变量作用域定义该变量子程序。 当全局变量与局部变量同名时: 定义局部变量子程序内,局部变量起作用;在其它地方全局变量起作用。

1.8K40

再说函数~那些不得不知道事儿

前面的课程中,我们已经对函数有了简单了解 函数声明、函数调用、函数参数以及返回值等等 本节内容主要对函数中一些高级操作进行讲解,方便大家项目操作过程中对函数操作更加灵活一些 函数递归...函数变量赋值 函数,一种操作行为 函数名称,其实是这种操作行为赋值变量 调用函数,其实是通过这个赋值变量加上一堆圆括号来进行函数执行 # 定义了一个函数,函数命名为printMsg def...,实际操作过程中有非常广泛应用。...,闭包就是函数A中添加定义了另一个函数B # 最后将函数B返回,通过函数B就可以直接使用局部变量,扩大了局部变量作用域 # # 为什么要使用闭包,闭包就是为了再多人协同开发项目过程中,同时会有多个人写多...# 个python文件并且要互相引入去使用,此时如果不同开发人员定义全局变量出现 # 名称相同,就会出现变量值覆盖引起数据污染,也称为变量全局污染。

46240

python之抽象一

函数局部名称-----包括参数在内-----并不和外面的函数名称冲突。 1.为什么想要修改参数 使用函数改变数据结构将程序抽象化好方法。...如果的确需要的话,可以使用globals函数获取全局变量值,该函数近亲vars,take返回全局变量字典(locals返回局部变量字典)。...如果在函数内部将值赋予一个变量,它自动成为局部变量----除非告知Python将其声明为全局变量。那么怎么才能告诉Python这是一个全局变量呢?...但是Python3.0中,nonlocal关键字被引入。它和global关键字使用方式类似,可以让用户对外部作用域变量进行赋值。 6.6 递归 递归定义包括它们自身定义内容引用。...如果没有到达基本实例的话,先找到middle,检查数字左边还是右边,然后使用新上下限继续调用递归过程。也可以将限制设为可选以方便用。

45210

函数|匿名函数|偏函数|装饰器函数

文章目录 1、 函数递归 2、 函数变量赋值 3、 参数中函数 4、 匿名函数 5、 返回值中函数:闭包 6、 偏函数 7、装饰器函数处理 1、 函数递归 函数递归,就是让函数内部调用函数自身情况...2、 函数变量赋值 函数,一种操作行为 函数名称,其实是这种操作行为赋值变量 调用函数,其实是通过这个赋值变量加上一堆圆括号来进行函数执行 # 定义了一个函数,函数命名为printMsg def...,实际操作过程中有非常广泛应用。...,闭包就是函数A中添加定义了另一个函数B # 最后将函数B返回,通过函数B就可以直接使用局部变量,扩大了局部变量作用域 # # 为什么要使用闭包,闭包就是为了再多人协同开发项目过程中,同时会有多个人写多...# 个python文件并且要互相引入去使用,此时如果不同开发人员定义全局变量出现 # 名称相同,就会出现变量值覆盖引起数据污染,也称为变量全局污染。

1.3K10

爆肝六万字整理python基础,快速入门python首选

大家好,又见面了,你们朋友全栈君。 文章目录 1 环境安装 2 Python第一程序Hello World 3 变量定义和类型 3.1 什么变量。...局部变量就是定义一个函数体内部变量 全局变量定义在外面的变量 例: a = 1 def f(): b = 2 其中a就是全局变量,而b局部变量。...局部变量函数体内部有效,出了函数体,外面访问不到,而全局变量则对下面的代码都有效。...全局变量可以直接在函数体内容部使用,你可以直接访问,但是注意,如果对于不可变类型数据,如果在函数里面进行了赋值操作,则对外面的全局变量不产生影响,因为相当于新建了一个局部变量,只是名字和全局一样...这究竟是为什么? 其实这里情况非常类似于局部作用域和全局作用域。 函数内访问变量时,会先在函数内部查询有没有这个变量,如果没有,就到外层中找。

1.7K10

一文学会「回溯搜索算法」解题技巧

这里需要说明一点 Java 语言中,方法传递都是值传递。对象类型变量传参过程中,复制都是变量地址。...下面我们对这一版代码做以下几个说明: 1、如果在每一个非叶子结点分支尝试,都创建新变量表示状态,那么 回到上一层结点时候不需要“回溯”; 递归终止时候也不需要做拷贝。...一些字符串“回溯”问题中,有时不需要回溯原因这样:字符串变量拼接过程中会产生新对象(针对 Java 和 Python 语言,其它语言并不清楚)。...在这里,由于我们很清楚全排列总是就是候选数组长度阶乘值,因此 res 变量初始化时候,最好传入 len 阶乘,让 ArrayList 代码执行过程中不发生扩容行为。...3、哪些搜索会产生不需要,这里要特别清楚深搜怎么运行深搜过程中,状态变量发生了什么变化。

1.2K10

Python基础语法(三)——函数

全局变量 (1)什么全局变量 如果一个变量,既能在一个函数中使用,也能在其他函数中使用,这样变量就是全局变量 demo如下: 定义全局变量 a = 100 def test1(): print...(4)总结1: 函数外边定义变量叫做全局变量 全局变量能够在所有的函数中进行访问 如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错 如果全局变量名字和局部变量名字相同,那么使用局部变量...print(li) ... >>> f2() [1, 1] >>> li [1, 1] (6)总结2: 函数中不使用global声明全局变量时不能修改全局变量本质不能修改全局变量指向,即不能将全局变量指向新数据...(十二)引用 python中,值靠引用来传递来。 我们可以用id()来判断两个变量是否为同一个值引用。 我们可以将id值理解为那块内存地址标示。...遗憾,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

1.2K10

python 变量锁_python字符串前面加b

大家好,又见面了,你们朋友全栈君。...一、全局解释器锁(GIL) 1、什么全局解释器锁 同一个进程中只要有一个线程获取了全局解释器(cpu)使用权限,那么其他线程就必须等待该线程全局解释器(cpu)使用权消失后才能使用全局解释器(...同一时刻一个进程下一个线程只能使用一个cpu,要确保这个线程下程序一段时间内被cpu执,那么就要用到同步锁。 2、为什么用同步锁?...2、同步锁作用:为了保证解释器级别下自己编写程序唯一使用共享资源产生了同步锁。 三、递归锁和死锁 1、什么死锁?...Python中为了支持同一个线程中多次请求同一资源,Python提供了可重入锁。

75610

Python基础5

另外,你可能注意到了,把country变成默认参数后,同时把它位置移到了最后面,为什么呢?...Alex Li 全局与局部变量 子程序中定义变量称为局部变量程序一开始定义变量称为全局变量全局变量作用域整个程序,局部变量作用域定义该变量子程序。...当全局变量与局部变量同名时: 定义局部变量子程序内,局部变量起作用;在其它地方全局变量起作用。...没错, 出错了, 为什么呢? 嵌套函数用法会了,但它有什么用呢?下节课揭晓。。。 4. 递归 函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。...由于Python允许使用变量,因此,Python不是纯函数式编程语言。 一、定义 简单说,"函数式编程"一种"编程范式"(programming paradigm),也就是如何编写程序方法论。

29610

python基础(5):深入理解 python赋值、引用、拷贝、作用域

函数参数传递时候,Python其实就是把参数里传入变量对应对象引用依次赋值给对应函数内部变量。...所以很明显,func_list修改一个可变对象,局部变量"a"和全局变量"t_list"指向还是同一个对象。...5.3 为什么修改全局dict变量不用global关键字 为什么修改字典d值不用global关键字先声明呢?...= 'bar'这句中,它是“有歧义“,因为它既可以是表示引用全局变量s,也可以是创建一个新局部变量,所以python中,默认它行为创建局部变量,除非显式声明global,global定义本地变量会变成其对应全局变量一个别名...d['b']=2这句中,它是“明确”,因为如果把d当作局部变量的话,它会报KeyError,所以它只能引用全局d,故不需要多此一举显式声明global。

1.5K70

Python基础3 函数、递归、内置函数

字典 key-value对 特性: 无顺序 去重 查询速度快,比列表快多了 比list占用内存多 为什么会查询速度会快呢?因为他hash类型,那什么hash呢?...函数调用结束返回主调用函数后则不能再使用该形参变量 实参可以是常量、变量、表达式、函数等,无论实参何种类型量,进行函数调用时,它们都必须有确定值,以便把这些值传送给形参。...Alex Li 全局与局部变量 子程序中定义变量称为局部变量程序一开始定义变量称为全局变量全局变量作用域整个程序,局部变量作用域定义该变量子程序。...当全局变量与局部变量同名时: 定义局部变量子程序内,局部变量起作用;在其它地方全局变量起作用。...3.返回值  要想获取函数执行结果,就可以用return语句把结果返回 注意: 函数执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数结束

48720

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

参数传递 Python中函数调用过程中参数传递使用顺序。 ? 关键字参数 ? ? 关键字参数有两大好处。...3、全局变量与局部变量 什么作用域 Python中一个变量一定范围内起作用,在其起作用这个范围我们称之为作用域。...全局变量与局部变量两者本质区别就是在于作用域 用通俗的话来理解的话, 全局变量整个py文件中声明,全局范围内都可以访问 局部变量某个函数中声明,只能在该函数中调用它,如果试图超出范围地方调用...可以看到函数内部对全局变量修改后,函数执行完毕,修改结果无效全局变量并不会受到影响 再看: Demo3: def fun(): num1*=2 print("函数内修改后...这是因为fun()函数使用了局部变量num1,它只是个跟全局变量同名局部变量,使用前还是要赋值,因此再次强调不要这样使用 global关键字 如果真的想要在函数体内修改全局变量值,就要使用global

65920
领券