作用域是指变量的有效范围。变量并不是在每一个位置都可以访问,访问权限取决于这个变量在哪里赋值,作用域哪个作用域内。在python中的作用域一共分为4种。分别是:
规则顺序: L –> E –> G –> B
先在局部作用域找,然后在闭包函数外的函数找,然后去全局找,然后去内置找。
上面的代码能够顺利执行,并打印a和b,c报错name ‘c’ is not defined。我们在function_2中并没有定义a和b两个变量,在上面代码b=2中,b作为了全局变量,属于全局作用域,没有定义在任何一个函数中。在function_1中定义a,这是一个局部变量,属于局部作用域,在function_1外部并不能访问到它,但是对于function_2中,变量a属于嵌套作用,在function_2中可以访问到,变量c属于局部作用域,在function_2之外无法访问。Python查找一个变量时会按照“局部作用域”、“嵌套作用域”、“全局作用域”和“内置作用域”的顺序进行搜索,前三者我们在上面的代码中已经看到了,所谓的“内置作用域”就是Python内置的那些标识符,我们之前用过的input
、print
、int
等都属于内置作用域。
定义在函数内部的变量属于局部作用域,定义在函数之外的属于全局作用域。
局部变量只能在被声明的函数内部访问,全局变量可以在整个程序范围内访问。当我们调用函数时,函数内部的变量会被加入到作用域中。
global:在函数内部声明全局变量,使得函数内部可以访问和修改全局变量的值
还是上述的例子,我们使用global函数使两个total的值相同
nonlocal:用于在嵌套函数中声明外部嵌套作用域中的变量,使得内部函数可以访问和修改外部函数中的变量。
上面已有
上面已有
闭包是一种特殊的函数,可以访问其外部作用域中定义的变量。使用 nonlocal
关键字可以在闭包中修改外部变量的值。