变量的作用域:为什么我在函数里改不了外面的变量?

写代码时你可能遇到过这种情况:在函数里定义了一个变量,想在函数外用它,结果报错说“找不到”;或者反过来,在函数外定义了一个变量,函数里改了它的值,可函数一结束,外面还是老样子——这背后,就是变量的作用域在起作用。

作用域,其实就是“地盘”

你可以把变量的作用域理解成它的“活动范围”。就像小区里的快递柜,只认本楼住户的取件码——变量也一样,它只能在自己被允许出现的地方被访问、修改。超出这个范围,就“看不见、摸不着”了。

最常见两种地盘:全局和局部

以 Python 为例,最直观:

x = 10  # 全局变量,整个文件都能看到(只要没被遮住)

def show():
    y = 20  # 局部变量,只在 show() 这个函数里有效
    print(x)  # ✅ 能读到全局的 x
    print(y)  # ✅ 能读到自己的 y

show()
print(x)  # ✅ 没问题,x 是全局的
print(y)  # ❌ 报错!y 只活在 show() 里面

再看一个更生活化的例子:你在厨房煮面(函数),往锅里加了盐(局部变量 salt),这盐只管这锅面;吃完面回客厅看电视(函数外),你不能指着茶几上的遥控器说“刚才我在厨房加的盐怎么还没化开?”——遥控器根本不知道厨房那锅盐的事。

同名变量,谁说了算?

如果函数内外用了同一个名字,比如都叫 count,那函数内部优先用自己“地盘”里的那个:

count = 100

def add():
    count = 1  # 新建一个局部 count,跟外面的没关系
    count += 1
    print(count)  # 输出 2

add()
print(count)  # 还是 100

这时候,外面的 count 毫不知情,它压根没被碰过。如果你想在函数里真改外面那个,Python 得加 global 声明(不过新手建议少用,容易绕晕)。

别只盯着 Python,其他语言也讲“地盘”

JavaScript 中用 varletconst 定义变量,作用域规则不同:var 是函数级,letconst 是块级(比如 iffor 大括号内)。C 语言里,大括号 {} 就是一道门,进去定义的变量,出门就失效。

记住一点:不是所有变量都“到处能用”,写代码前先想想——这个变量,该让它在哪块儿待着?