导语:在 Python 编程中,你是否遇到过这样的困惑:明明在函数里定义了变量,函数外却死活找不到?或者明明改了全局变量的值,打印出来却还是原样? 今天,我们就通过 “变量作用域” 这一讲,拆解 Python 查找变量的底层逻辑。
一、 什么是作用域?
作用域(Scope) = 变量在哪个范围内可以被访问。
在 Python 中,我们最常打交道的是两类“领地”:
全局变量: 定义在函数之外,像“广播”一样全场可见。
局部变量: 定义在函数内部,像“悄悄话”一样只在函数内有效。
二、 局部变量:函数里的“小秘密”
观察下面这段代码:
def test(): x = 5 # 这是一个局部变量test()print(x)
运行结果:
NameError: name 'x' is not defined
解析: 变量 x 是在 test() 函数内部出生的,它的生命周期随着函数运行结束而消失。外面的世界想访问它?门都没有!
三、 全局变量:只许看,不许动?
1. 全局变量可以“读取”
函数内部是可以直接读取外部定义的全局变量的:
x = 10 # 全局变量def show(): print(x) # 读取全局变量show()# 输出:10
2. 为什么直接修改会失败?
这是很多新手最容易踩的坑:
x = 10def change(): x = 20 # 试图修改change()print(x)# 输出:10
解析: 当你在函数内部写下 x = 20 时,Python 并没有去改外面的全局变量,而是在函数内部新建了一个同名的局部变量 x。函数一结束,这个局部变量就销毁了,外面的 x 依然是 10。
四、 终极武器:global 关键字
如果你非要在函数内部修改全局变量,必须先发出一声“声明”:
x = 10def change(): global x # 郑重声明:我要用的是外面的那个 x x = 20change()print(x)# 输出:20
划重点:global 就像一张通行证,赋予了函数修改全局变量的权力。
五、 变量查找的“潜规则”:LEGB 规则
当你在代码里引用一个变量时,Python 会按照以下顺序从内向外像剥洋葱一样查找:
L (Local): 当前函数内部(局部作用域)。
E (Enclosing): 嵌套函数的外层(闭包作用域)。
G (Global): 当前模块的最外层(全局作用域)。
B (Built-in): Python 自带的内置函数,如 print、len(内置作用域)。
口诀: 如果当前找不到,就往外走一步;直到最外面都找不到,才会报错。
六、 本讲总结
我为你整理了一套《Python零基础保姆级教程》,这不只是干巴巴的理论,而是包含:
✅ 完整版 Python 零基础到精通完整代码
✅ 完整注释讲解,一键运行
👇 获取方式:
想要解锁 [Python保姆级教程] 的同学,可以点击下方赞赏支持博主,并在后台留言