Python函数作用域理解及使用技巧
函数是Python编程中很重要的一个部分,它能够将一个大的程序分割成小的、可重复使用的操作块。当我们写函数时,就需要考虑函数的作用域。
在Python中,作用域分为全局作用域和局部作用域。全局作用域中的变量可以在程序的任何地方被访问,而局部作用域中的变量只能被在其定义范围内的代码访问。函数就是一个局部作用域。
在Python中,函数内部和外部的变量是相互独立的。函数内部可以访问外部的全局变量,但是如果在函数内部重新定义了一个同名变量,那么函数内部的变量就会遮蔽掉外部的变量。这是因为Python使用了变量查找的“LEGB规则”:
L,局部作用域,即函数内部的作用域
E,外部嵌套函数的作用域
G,全局作用域,即模块级别的作用域
B,内置作用域,即Python语言内置的作用域,例如int和str等。
下面是一个简单的例子:
a = 10
def foo():
a = 5
print("a in foo:", a)
foo()
print("a outside foo:", a)
输出结果为:
a in foo: 5 a outside foo: 10
我们可以看到,在函数内部重新定义了a变量,并且在函数外部再次访问a变量时,得到的值是外部的全局变量a的值。
不过,有时候我们想要在函数内部改变外部的变量,该怎么办呢?这时候可以使用global关键字来声明一个变量是全局变量,例如:
a = 10
def foo():
global a
a = 5
print("a in foo:", a)
foo()
print("a outside foo:", a)
输出结果为:
a in foo: 5 a outside foo: 5
在这个例子中,我们在函数内部使用了global关键字声明了变量a是全局变量,这样就可以改变外部的变量a的值了。
除了global关键字,还有一个nonlocal关键字,用来声明一个变量是外部嵌套函数的局部变量。例如:
def outer():
x = 10
def inner():
nonlocal x
x = 5
print("x in inner:", x)
inner()
print("x in outer:", x)
outer()
输出结果为:
x in inner: 5 x in outer: 5
在这个例子中,我们使用了nonlocal关键字声明了变量x是外部嵌套函数outer的局部变量,这样就可以在inner函数内部改变outer函数的局部变量x的值了。
总之,Python函数的作用域是非常重要的,我们需要理解它,并且在合适的时候使用global和nonlocal关键字来改变外部变量的值。
