1. 什么是作用域?
LEGB是指在Python中变量的作用域规则,它是一个从内到外的顺序,表示了变量的查找顺序。LEGB分别代表了以下四个作用域:
-
Local(局部):指的是在函数内部定义的变量,只在函数内部有效。
-
Enclosing(嵌套):指的是在嵌套函数中定义的变量,对于内部函数来说,可以访问外部函数中定义的变量。
-
Global(全局):指的是在模块级别定义的变量,对于整个模块来说都是可见的。
-
Built-in(内置):指的是Python内置的函数和变量,如print()、len()等。
当需要访问一个变量时,Python会按照LEGB的顺序进行查找,先从局部作用域开始查找,如果找不到再依次向外层作用域查找,直到找到或者到达全局作用域。如果最终还是找不到,则会抛出NameError异常。
2. global关键字的应用
在函数内部,如果想要修改全局作用域中的变量,可以使用global关键字。
x = 10
def modify_global():
global x
x = 20
modify_global()
print(x) # 输出 20
在上面的例子中,通过使用global关键字,我们可以在函数内部修改全局变量x的值。
3. nonlocal关键字的应用
在嵌套函数中,如果想要修改嵌套作用域中的变量,可以使用nonlocal关键字。
def outer():
x = 10
def inner():
nonlocal x
x = 20
inner()
print(x) # 输出 20
outer()
在上面的例子中,通过使用nonlocal关键字,我们可以在内部函数inner中修改外部函数outer中的变量x的值。
4. 简单案例
下面是一个简单的案例,演示了作用域、global和nonlocal的应用。
x = 10
def outer():
y = 20
def inner():
nonlocal y
global x
x = 30
y = 40
print("inner函数中的x:", x) # 输出 30
print("inner函数中的y:", y) # 输出 40
inner()
print("outer函数中的x:", x) # 输出 30
print("outer函数中的y:", y) # 输出 40
outer()
print("全局作用域中的x:", x) # 输出 30
在上面的案例中,我们定义了一个全局变量x和一个外部函数outer,外部函数中定义了一个局部变量y和一个内部函数inner。在内部函数inner中,我们使用了nonlocal关键字修改了外部函数outer中的变量y的值,并使用global关键字修改了全局变量x的值。最后,我们分别在inner函数、outer函数和全局作用域中打印了变量x和y的值。
网友评论