想象一下,你有一个玩具箱,里面的玩具只能在自己房间(比如你的卧室)里玩;而客厅里的玩具(如果有的话),你在卧室也能拿到。在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()
总结:关键规则¶
- 局部作用域:函数内部定义的变量,仅在函数内有效。
- 全局作用域:函数外定义的变量,整个程序都能访问。
- 修改全局变量:必须用
global声明,否则Python会当成局部变量。 - 嵌套函数:内层函数修改外层局部变量,要用
nonlocal声明。
合理使用作用域能让代码结构更清晰,避免变量名冲突。多写几个小例子测试不同场景,很快就能熟练掌握啦!