作用域小课堂:Python变量的局部与全局作用域

想象一下,你有一个玩具箱,里面的玩具只能在自己房间(比如你的卧室)里玩;而客厅里的玩具(如果有的话),你在卧室也能拿到。在Python中,变量也有类似的“活动范围”——作用域,它决定了变量能被访问的范围。今天我们就来聊聊Python中最常见的两种作用域:局部作用域和全局作用域。

一、局部作用域:函数里的“小秘密”

如果一个变量是在函数内部定义的,那它就只能在这个函数内部被访问和修改,就像你藏在抽屉里的玩具,只有在抽屉所在的房间(函数内部)才能“拿出来玩”。这就是局部作用域(Local Scope)。

举个例子

# 定义一个函数,函数内部有局部变量
def my_function():
    age = 18  # age是局部变量,只在my_function里有效
    print("函数内部:", age)  # 可以正常打印

my_function()  # 输出:函数内部: 18
print("函数外部:", age)  # 报错!因为age是局部变量,外面找不到

如果在函数内部定义了一个和全局变量同名的局部变量,Python会优先把它当作“局部的”,而不是全局的。比如:

x = 100  # 全局变量x

def my_function():
    x = 200  # 这里x是局部变量,覆盖了全局的x
    print("函数内部x:", x)  # 输出:200

my_function()
print("函数外部x:", x)  # 输出:100(全局x没被修改)

二、全局作用域:程序里的“大玩具”

如果一个变量是在所有函数外面定义的,那它就是全局变量(Global Scope),整个程序的任何地方都能访问它,就像你放在客厅的大玩具箱,全家都能拿到。

直接访问全局变量

name = "小明"  # 全局变量,所有地方都能访问

def say_hello():
    print("你好," + name)  # 可以直接用全局变量name

say_hello()  # 输出:你好,小明
print(name)  # 输出:小明

修改全局变量的坑
在函数内部直接修改全局变量会报错吗?不,Python会“误会”你要创建一个局部变量。比如:

score = 80  # 全局变量

def update_score():
    score = 90  # 这里Python会认为是新的局部变量,而不是修改全局
    print("函数内部score:", score)  # 输出:90

update_score()
print("函数外部score:", score)  # 输出:80(全局score没变!)

正确修改全局变量:要在函数内部用global关键字告诉Python“我要修改的是全局变量,不是局部的”。

score = 80

def update_score():
    global score  # 声明:score是全局变量,要修改它
    score = 90
    print("函数内部score:", score)  # 输出:90

update_score()
print("函数外部score:", score)  # 输出:90(全局score被修改了)

三、进阶:嵌套函数与nonlocal(了解即可)

如果函数内部又定义了另一个函数(嵌套函数),内层函数可以访问外层函数的局部变量,但如果想修改外层函数的局部变量,需要用nonlocal关键字。

例子

def outer_function():
    outer_var = "外层变量"  # outer_var是outer的局部变量,也是inner的“非局部变量”

    def inner_function():
        nonlocal outer_var  # 声明:修改outer_var的是外层函数的局部变量
        outer_var = "被修改的外层变量"
        print("内层函数内部outer_var:", outer_var)  # 输出:被修改的外层变量

    inner_function()
    print("外层函数内部outer_var:", outer_var)  # 输出:被修改的外层变量

outer_function()

总结:关键规则

  1. 局部作用域:函数内部定义的变量,仅在函数内有效。
  2. 全局作用域:函数外定义的变量,整个程序都能访问。
  3. 修改全局变量:必须用global声明,否则Python会当成局部变量。
  4. 嵌套函数:内层函数修改外层局部变量,要用nonlocal声明。

合理使用作用域能让代码结构更清晰,避免变量名冲突。多写几个小例子测试不同场景,很快就能熟练掌握啦!

小夜