前面我们已经学会了自定义函数 、函数参数、返回值,很多同学写代码时遇到过这种诡异问题:函数外面定义的变量 ,在函数里面修改后,外面的值没变;嵌套函数中想修改外层函数变量直接报错 。
其实所有问题的核心,都是变量作用域没搞明白!这是Python基础的核心重难点 ,也是面试高频考点。今天我们从零吃透作用域,手把手学会 global 和 nonlocal 两个关键关键字,彻底解决变量修改混乱问题。
一、什么是变量作用域?
简单来说:变量的生效范围 。
我们定义的每一个变量 ,都不是全局通用的,它有专属的“生效区域”,出了这个区域 ,变量就会失效 、无法调用。Python中一共分为四大作用域,优先级从低到高(查找顺序从近到远):
1. L(Local)局部作用域:函数内部定义的变量,仅当前函数生效
2. E(Enclosing)嵌套作用域:嵌套函数中,外层函数的变量(仅嵌套场景生效)
3. G(Global)全局作用域:函数外部、脚本顶层定义的变量 ,整份代码生效
4. B(Built-in)内置作用域:Python自带的内置函数/变量(如print、len)
核心查找规则
就近原则:代码调用变量时,优先在当前局部找 → 找不到找外层嵌套 → 再找全局 → 最后找系统内置。
二 、全局作用域 vs 局部作用域(基础核心)
这是最常用的两种作用域,90%的基础代码问题都出自这里 。
1. 全局变量
定义在所有函数外部、脚本最外层的变量 ,整个文件的所有函数都可以读取。
示例代码:
python
# 全局变量(全局作用域)
name = "学生"
def show_name():
# 函数内部可以直接读取全局变量
print("函数内部读取:", name)
# 调用函数
show_name()
# 外部直接读取全局变量
print("函数外部读取:", name)
运行结果:
plaintext
函数内部读取: 学生
函数外部读取: 学生
2. 局部变量
定义在函数内部的变量,仅当前函数可用,函数执行结束后 ,局部变量会自动销毁。
示例代码:
python
def show_msg():
# 局部变量(仅当前函数生效)
msg = "欢迎学习Python"
print("局部变量:", msg)
show_msg()
# 报错!外部无法调用函数内部的局部变量
print(msg)
运行报错: NameError: name 'msg' is not defined
✅ 总结:局部变量只属于自己函数,外部完全无法访问 。
三、新手高频坑:函数内修改全局变量
很多新手会犯一个错:函数内想修改全局变量,结果修改无效 ,甚至报错。
错误示例(重点避坑)
python
# 全局变量
num = 100
def change_num():
# 试图修改全局变量
num = 200
print("函数内num:", num)
change_num()
# 全局变量没有被修改!
print("全局num:", num)
运行结果:
plaintext
函数内num: 200
全局num: 100
原理详解
Python的规则:函数内部直接赋值变量时,会默认创建一个新的局部变量,不会修改全局变量。
上面代码中 ,函数内的 num=200 是新的局部变量,和外部全局变量 num 是两个完全无关的变量。
如果想要在函数内部修改全局变量,就必须用到今天的核心关键字: global
四 、global关键字:修改全局变量
作用
声明当前函数内的变量是全局变量,不再创建局部变量 ,直接对全局变量进行修改 。
正确用法示例
python
# 全局变量
num = 100
def change_num():
# 声明num为全局变量
global num
# 直接修改全局变量
num = 200
print("函数内修改后:", num)
change_num()
# 全局变量同步修改成功
print("全局最终值:", num)
运行结果:
plaintext
函数内修改后: 200
全局最终值: 200
global使用注意事项
1. global 声明必须写在函数内部变量使用之前
2. 可以一次性声明多个全局变量: global a, b, c
3. 仅用于修改全局变量,只读全局变量无需声明
五、嵌套作用域 & nonlocal关键字
学会了全局、局部,我们进阶学习嵌套函数的变量规则 ,也是面试必考重点。
什么是嵌套函数
函数里面再定义函数,外层函数、内层函数形成嵌套结构。
- 外层函数变量:属于嵌套作用域(E)
- 内层函数变量:属于局部作用域(L)
新手坑:内层函数修改外层函数变量
python
def outer():
# 外层函数变量(嵌套作用域)
age = 18
def inner():
# 试图修改外层变量,报错
age = 20
print("内层age:", age)
inner()
print("外层age:", age)
outer()
和全局变量问题一致:内层直接赋值 ,会创建内层局部变量,外层变量不变 。
nonlocal关键字用法
专门用于嵌套函数,修改外层函数的变量(非全局变量)
正确示例:
python
def outer():
age = 18
def inner():
# 声明age为外层函数变量
nonlocal age
age = 20
print("内层修改后age:", age)
inner()
# 外层变量同步修改
print("外层最终age:", age)
outer()
运行结果:
plaintext
内层修改后age: 20
外层最终age: 20
六 、global 和 nonlocal 核心区别(一秒分清)
关键字 作用场景 修改对象
global 普通函数 全局变量
nonlocal 嵌套函数 外层函数变量(非全局)
终极口诀
改全局 ,用global;改外层,用nonlocal;只读不用声明,赋值必看作用域!
七、综合实战案例(巩固所有知识点)
写一段代码 ,融合全局变量、global 、嵌套函数、nonlocal:
python
# 全局变量
count = 0
def outer():
# 嵌套作用域变量
num = 10
def inner():
# 修改外层函数变量
nonlocal num
num += 5
# 修改全局变量
global count
count += 1
print("内层num:", num)
print("全局count:", count)
inner()
print("外层num:", num)
# 执行代码
outer()
print("最终全局count:", count)
运行结果:
plaintext
内层num: 15
全局count: 1
外层num: 15
最终全局count: 1
八、本节课重点总结
1. 变量四大作用域:局部→嵌套→全局→内置,遵循就近查找原则
2. 普通函数内修改全局变量,必须用 global 声明
3. 嵌套内层函数修改外层函数变量,必须用 nonlocal 声明
4. 只读变量无需声明 ,赋值修改变量必须区分作用域
5. 局部变量函数结束即销毁,全局变量全程生效
这节课解决了Python函数变量最核心的混乱问题,彻底掌握作用域后 ,你写函数代码将再也不会出现变量值异常 、莫名报错的问题!
本文来自作者[向梦]投稿,不代表点新号立场,如若转载,请注明出处:https://sc-hx.cn/yule/202609-14479.html
评论列表(3条)
我是点新号的签约作者“向梦”
本文概览:python定义全局变量|(python定义全局变量global)前面我们已经学会了自定义函数、函数参数、返回值,很多同学写代码时遇到过这种诡异问题:函数外面定义的变量,在函数...
文章不错《python定义全局变量|(python定义全局变量global)》内容很有帮助