在Python中,变量的“作用域”指的是变量可以在哪些地方被访问到。通常,变量定义在函数内部时只能在这个函数里使用,而在函数外部(全局)定义则可以被整个程序访问。本文将讲解局部变量、全局变量、以及global与nonlocal关键词的用法。
1. 局部变量(Local Scope)
当一个变量在函数内部被创建时,它就属于这个函数的局部作用域,只有该函数内可以使用,函数外部无法访问:
def myfunc():
x = 300
print(x)
myfunc()
print(x) # 错误:x在函数外无效
上例中,x
是局部变量,离开函数后就不存在了。
1.1 函数内部的内部函数
如果还有更内层的函数,也能访问外层函数创建的局部变量:
def myfunc():
x = 300
def myinnerfunc():
print(x) # 可以访问外层函数的变量x
myinnerfunc()
myfunc() # 输出 300
2. 全局变量(Global Scope)
在函数外定义的变量,为全局变量,可在程序的任何位置使用,包括函数内部:
x = 300
def myfunc():
print(x) # 可访问全局变量
myfunc()
print(x) # 在函数外也能访问
如果在函数内部用相同变量名赋值,并没有声明global,那么这个名字只会在函数里视为另一个局部变量,与外面的同名变量互不影响。
x = 300
def myfunc():
x = 200
print(x) # 输出200
myfunc()
print(x) # 输出300
3. global关键字
如果想在函数内部修改一个全局变量,需要显式使用global
声明:
x = 300
def myfunc():
global x
x = 200
myfunc()
print(x) # 输出200,说明全局x已被修改
也可以在函数内直接创建一个global
变量,让它在整个程序都可使用:
def myfunc():
global y
y = 100
myfunc()
print(y) # 输出100
4. nonlocal关键字
nonlocal
用于嵌套函数之间,让内层函数修改外层函数的变量,但不是全局变量。例如:
def outer():
x = "外层函数变量"
def inner():
nonlocal x # 声明修改外层函数x
x = "被内层函数改动了"
inner()
return x
print(outer()) # 输出: 被内层函数改动了
这样,你既不会影响全局变量,又能在嵌套函数里修改更外层函数的变量。
5. 为什么需要作用域
作用域可帮助我们管理变量的生命周期与可见范围,避免重复命名冲突,同时让代码逻辑更明确。通过global
或nonlocal
可在需要时对外层变量进行修改,但在实际编程中要谨慎使用,防止影响可维护性。
总结
- 局部变量:在函数内定义,只能在该函数里使用。
- 全局变量:在函数外定义,所有地方都能访问。
- global:在函数内声明一个变量为全局,或修改全局变量。
- nonlocal:在内层函数里修改外层函数的变量。
掌握这些作用域规则,可使你更合理地安排变量位置,避免混淆与命名冲突,写出更简洁易读的Python代码。