目录

1.作用域分类

1.1局部作用域

1.2全局作用域

2.嵌套函数

3.LEGB规则


1.作用域分类

作用域分为局部作用域和全局作用域。

1.1局部作用域

如果一个变量定义的位置是在函数的里面,则该变量的作用域仅限于函数,同时该变量也称为局部变量。例如:

def myfunc():
    a = 233
    print(a)

    
myfunc()#调用函数
>>>233
myfunc(a)#调用函数并且访问函数里面的变量a
>>>Traceback (most recent call last):
  File "<pyshell#73>", line 1, in <module>
    myfunc(a)
NameError: name 'a' is not defined

当调用函数的局部变量的时候,则会出现报错,例如以上代码中的myfunc(a)。

1.2全局作用域

如果在任何函数的外部去定义一个变量,那么该变量的作用域则为全局作用域,该变量称为全局变量。例如:

a = 233
def myfunc():
    print(a)

    
myfunc()
>>>233

此外,当局部变量和全局变量的变量名相同时,局部变量会覆盖全局变量,当我们调用全局变量的时候,局部变量就会失效。

例如:

a = 233
def myfunc():
    a = 332
    print(a)

    
myfunc()
>>>332
print(x)
>>>233

注意:虽然局部变量和全局变量的变量名相同,但是两个变量并不相同。

2.嵌套函数

嵌套函数表示定义一个函数的时候,函数体里还能定义另一个函数。

例如:

def funca():
    n = 1
    def funcb():
        m = 2
        print("函数b的值为",m)
    print("函数a的值为",n)

    
funca()
>>>函数a的值为 1

以上代码表示对funca()函数进行调用,又因为该函数为嵌套函数,故继续调用funcb()函数,直接输出funcb()函数的值。

注意:不能直接调用嵌套函数内的函数,否则会进行报错

但是可以在函数里面对嵌套函数进行调用,例如:

def funca():
    n = 1
    def funcb():
        m = 2
        print(m)
    funcb()
    print(n)

    
funca()
>>>2
>>>1

由此程序可知内部函数funcb()可以访问外部函数的变量n,但却不可以修改外部变量,此时我们可以使用nonlocal语句就可以实现僭越。

例如:

def funca():
    x = 233
    def funcb():
        nonlocal x#使用nonlocal语句对变量x变为自由变量,即可被修改
        x = 332
        print("In funcb,x=",x)
    funcb()
    print("In funcb,x=",x)

    
funca()
>>>In funcb,x= 332
>>>In funcb,x= 332


def funca():
    x = 233
    def funcb():
        x = 332
        print("In funcb,x=",x)
    funcb()
    print("In funcb,x=",x)


funca()
>>>In funcb,x= 332
>>>In funcb,x= 233

3.LEGB规则

Local 可能是在一个函数或者类方法内部,即函数的内部变量(局部变量)。
Enclosed 可能是嵌套函数内,比如说 一个函数包裹在另一个函数内部,即嵌套函数里面比较外层的变量(相对于最里面一层)。
Global 代表的是执行脚本自身的最高层次,即函数的全局变量。
Built-in 是Python为自身保留的特殊名称。

其中,Local -> Enclosed -> Global -> Built-in,即在程序执行的过程中变量考虑的优先级