1、基本概念

作用域(Scope)是在程序组定义变量或函数时,这些变量或函数可被访问的范围。在不同的作用域中,变量和函数的可见性和访问性是不同的。

当访问一个变量时,Python会按照LEGB的顺序进行查找,知道找到第一个匹配的变量,然后停止查找。如果在所有作用域中都找不到变量的定义,就会引发NameError

  • L(Local):局部作用域。包括函数内部定义的变量和参数。在函数内部先进行变量查找
  • E(Enclosing):嵌套函数的父函数作用域。如果在当前函数内部找不到变量,就会向上一层嵌套的函数中查找。
  • G(Global):全局作用句。在模块层次定义的变量,对于整个模块都是可见的。
  • B(Built-in):内置作用域。包括Python的内置函数和异常。

2、作用域说明

x= 1					#全局变量x

def outer_function():
    x = 10				#外部函数的局部变量x,对于内部函数它是父函数

    def inner_function():	
        x = 100			#内部函数的局部变量x
        print("内部x", x)


    inner_function()
    print("外部x", x)


outer_function()
print("全局x", x)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

结果演示:

Python函数的作用域_nonlocal

当内部函数的x = 100注释后,结果为

Python函数的作用域_作用域_02

当只注释外部函数的x = 10后,结果为:

Python函数的作用域_nonlocal_03

由此可得知,函数内变量的取值,是自己局部作用域为最先,其次是外一层的变量,而它不会取自己内一层的变量值。

注意:在项目中会有很多的函数,函数涉及到的变量,非特殊情况下变量务必配置为局部变量作用域,否则极易造成全局变量污染。

3、global和nonlocal关键字

  • global:全局声明

在函数内通过global声明变量的方式,改变某个全局变量的值

x= 1
def test_value():
    global x
    x = 10
    print("函数的x",x)


test_value()
print("全局的x",x)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

Python函数的作用域_nonlocal_04

  • nonlocal:非本地局部声明,一般在嵌套函数中使用

本地有某个变量,会将外一层该变量的值变为本的的值

x= 1
def outer_function():
    x = 10

    def inner_function():
        nonlocal x
        x = 100
        print("内存函数的x",x)


    inner_function()
    print("外层函数的x", x)


outer_function()
print("全局x",x)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

Python函数的作用域_作用域_05

此方法只影响向外1层的变量

Python函数的作用域_Python_06

若非嵌套函数使用,会报错,此处应使用global方式

Python函数的作用域_LEGB_07