Python学习笔记函数之局部和全局作用域
随笔记录方便自己和同路人查阅。
#------------------------------------------------我是可耻的分割线-------------------------------------------
在被调用函数内赋值的変元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。
处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。一个变量必是其中一种,不能
即是局部又是全局。
可以将“作用域”看成是变量的容器,当作用域被销毁时,所有保存在该作用域内的变量的值就被丢弃了。只有一个
全局作用域,它是程序开始时创建的。如果程序终止,全局作用域就被销毁,他的所有变量就被丢弃了。否则,下次你
运行程序的时候,这些变量就会记住他们上次运行时的值。
一个函数被调用时,该函数返回时,这个局部作用域就被销毁了,这些变量就丢失了。下次调用这个函数,局部变量
不会记得该函数上次被调用时它们保存的值。
作用域很重要,理由如下:
(1)全局作用域中的代码不能使用任何局部变量
(2)但是,局部作用域可以访问全局变量
(3)一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量
(4)如果在不同作用域中,你可以使用相同的名字命名不同变量。也就是说可以有一个名为spam的局部变量,和一个
名为spam的全局变量
Python有不同的作用域,而不是让所用东西都成为全局变量,这是有理由的。这样一来,当特定函数调用中的代码修改
变量时,该函数与程序其他部分的交互,只能通过他的参数和返回值。这就缩小了可能导致缺陷的代码作用域。如果程序只
包含全局变量,又有一个变量赋值错误的缺陷,那就很难追踪这个赋值错误发生的位置。它可能在程序的任何地方赋值,而
你的程序可能有几百到几千行!但如果缺陷是因为局部变量做粗赋值,你就会知道,只有那一个函数中的代码可能产生赋值
错误。
虽然在小程序中使用全局变量没有太大问题,但当程序变得越来越大时,依赖全局变量就是一个坏习惯。
#------------------------------------------------我是可耻的分割线-------------------------------------------
1、局部变量不能在全局作用域内使用,示例代码:
1 2 3 4 5 6 7 | # # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def hell(): #定义一个函数 local = 1 + 1 #定义一个局部变量<br>hello() print (local) #在全局作用域打印局部变量 |
运行结果:
发生错误是因为,local只属于hello函数创建的局部作用域。在程序执行从hello()函数返回后,该局部作用域就被销毁了,
不在有名为local的变量。所以当程序试图执行print(local)时,Python就报错,说local没有定义。这是有意义的,当程序执行
在全局作用域中时,不存在局部作用域,所以不会有任何局部变量。这就是为什么只有全局变量能用于局部作用域。
2、局部作用域不能使用其他局部作用域内的变量,示例代码:
1 2 3 4 5 6 7 8 9 | # # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def hello(): #定义一个函数1 hello_local = 1 + 1 #定义一个局部变量 def world(): #定义一个函数2 world_local = hello_local + 1 #使用函数1中的局部变量 world() #调用函数 |
运行结果:
3、全局变量可以在局部作用域中读取,示例代码:
1 2 3 4 5 6 7 8 | # # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def hello(): #定义一个函数1 print (name) #打印全局变量 name = "Li Rong Yang" #全局变量 hello() #调用函数 |
运行结果:
4、名称相同的局部变量和全局变量
局部变量是可以和全局变量同名的,在语法上完全合法。但我们在写代码时应尽量避免局部变量和全局变量同名。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # # -*- coding:utf-8 -*- # Autor: Li Rong Yang #import random def spam(): eggs = 'spam local' print (eggs) def bacon(): eggs = 'bacon loacl' print (eggs) spam() print ( '我是spam的 eggs:%s' ,eggs) eggs = 'global' bacon() print (eggs) |
运行结果:
从运行结果可以看出,两个函数中的局部变量eggs和全局变量eggs都被打印了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异