写代码的时候,你有没有遇到过这样的情况:在一个函数里改了个值,结果另一个函数里的数据莫名其妙变了?或者明明定义了变量,却在某个地方用不了?这很可能就是全局变量和局部变量搞的鬼。
什么是全局变量和局部变量
简单来说,全局变量就是在整个程序里都能访问的变量,而局部变量只能在它被定义的那个“小圈子里”用。比如在函数内部定义的变量,一般就是局部的,出了这个函数就找不到了。
举个生活中的例子:你在家里有个公用冰箱(全局变量),谁都能去拿饮料;但你抽屉里藏了一包零食(局部变量),只有你自己知道在哪,别人进不来你的房间就吃不到。
代码里长什么样
来看一段 Python 代码:
name = "小明" # 全局变量
def say_hello():
age = 18 # 局部变量
print(name) # 能访问全局变量
print(age)
def say_goodbye():
print(name) # 可以访问
# print(age) # 这行会报错!age 是局部的,这里看不见
say_hello()
say_goodbye()
上面这段代码中,name 在所有函数外定义,谁都能用;而 age 只属于 say_hello 函数,别的函数想用就会出错。
局部变量也能“重名”
有时候你会看到不同函数里都有叫 i 的循环变量,这没问题,因为它们是各自函数内的局部变量,互不影响。
def count_a():
i = 0
for i in range(3):
print("A:", i)
def count_b():
i = 5 # 和上面的 i 不冲突
for i in range(2):
print("B:", i)
count_a()
count_b()
输出结果不会互相干扰,就是因为每个 i 都只在自己的函数里有效。
小心:别随便改全局变量
虽然可以在函数里读取全局变量,但如果要修改它,就得加 global 关键字,不然 Python 会以为你要新建一个同名的局部变量。
level = 1
def upgrade():
global level
level = level + 1
print("升级了,当前等级:", level)
upgrade() # 输出:升级了,当前等级:2
print(level) # 外面也能看到新值
如果不加 global,函数会创建一个新的局部 level,外面的值根本没变,容易让人一头雾水。
为什么要注意这个区别
项目一复杂,到处乱用全局变量就像在厨房随便放调料,下次做饭根本找不到要用的那个。变量作用域不清,bug 就难查,协作开发时更是一团糟。
合理的做法是:能用局部变量解决的,就不要往上抛成全局的。把数据控制在最小可用范围内,代码才干净、好维护。