1.作用域的分类
在Python中,变量作用域决定了变量在哪里可以被访问和修改。Python的作用域规则是基于LEGB原则,即” Local , Enclosing , Global , Built-in ”,这表示变量的查找顺序是:局部作用域、外部嵌套作用域、全局作用域和内置作用域。
(1)局部作用域(Local):当你在函数内部定义一个变量时,这个变量就属于局部作用域。它只能在函数内部被访问和修改。局部变量在函数每次被调用时创建,函数调用结束后,局部变量就会被终止。
(2)外部嵌套作用域(Enclosing):如果你在一个函数中定义了另一个函数,那么内部函数可以访问外部函数的变量,这些变量对于内部函数来说就构成了外部嵌套作用域。外部嵌套作用域的变量通常用于闭包。
(3)全局作用域(Global):在函数外部定义的变量属于全局作用域。全局变量可以在程序的任何地方被访问和修改。
(4)内置作用域(Built-in):Python内置了大量的函数和变量,如print()、range()、len()等......它们位于内置作用域中。内置作用域的变量可以在任何地方被访问,没有特定的定义位置。
接下来,就局部变量和全局变量举个例子:
student=40 # 此处student为全局变量
def class_one(boy, girl):
student = boy + girl # 此处student为局部变量
print("函数内局部变量student:",student)
return student
class_one(22,23) # 调用class one函数
print("函数外部全局变量student:student)
从上面代码可知:所谓局部变量,指的是定义在函数内的变量。定义在函数内的变量,只能在函数内使用,它与函数外部,具有相同名称的其他变量没有任何关系。不同的函数,可以定义相同名字的局部变量,并且各个函数内的变量不会产生影响。
总而言之,局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。全局变量是定义在函数外的变量,它拥有全局的作用域。
2.关于”global ”和”nonlocal ”关键字
在Python中,如果在函数内部想修改一个全局变量,就使用global关键字来声明。同样,如果想在一个内部函数中修改外部嵌套作用域的变量,则使用nonlocal关键字来声明。
①”global ”
boy = 20
def total boy():
boy += 2
print(boy)
total boy()
上述代码中,在函数内部对全局变量boy进行修改,Python会把变量boy当做是局部变量,而在进行“boy += 2”之前,我们是没有声明局部变量boy的,因此,程序会报错。
boy = 20
def total_boy():
global boy # 声明变量boy为全局变量
boy += 2
print(boy)
total boy()
此时,在函数内使用 global 关键字进行声明
②”nonlocal ”
def class_four():
# 给外层的class_four函数定义一个count变量
count = 40
# 嵌套在内层的two_guys_in函数再给count重新赋值
def two_guys_in():
nonlocal count # 只是修改嵌套作用域中的变量的值,而非创建新的变量
count = 42
two_guys_in()
# 在class_four函数中输出新赋值的count
print(count)
class_four() # 调用class_four函数
以上代码可知:若要修改外层函数class_four中的变量count(此时被赋值40),则需在内层中使用nonlocal关键字
可以看到,内层函数修改了变量值
还需注意的一点:使用 global关键字修饰的变量之前可以不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在。
通俗点讲可以理解为:
使用 global关键字时,第一行可以不写/不定义全局变量。
def boys():
global boy
boy = 2
boys()
print(boy)
然后、使用nonlocal关键字时,外层应当已经有定义好变量了,不然改个锤子......