函数 - 变量作用域
作用域是指变量的有效作用范围。
-
通常情况下,在编程语言中, 变量的作用域从代码的数据结构形式来看,有块级、函数、类、包、模块等从小到大的级别。
-
但在 python 中没有块级作用域,也就是 if、for 等语句块是没有作用域的。
-
通常来讲,内部代码可以访问外部变量,而外部代码通常无法访问内部变量。变量的作用域决定了程序的哪一部分可以访问哪个特定的变量名称。
python 的作用域一共有 4 层:
- L(Local):局部作用域
- E(EnEnclosing):闭包函数外的函数中
- G(Global):全局作用域
- B(Built-in):内建作用域
python 以 L->E->G->B 的规则查找变量。
全局变量和局部变量
- 全局变量:定义在函数外的拥有全局作用域的变量。全局变量可以在整个程序范围内访问
- 局部变量:定义在函数内部的拥有一个局部作用域的变量。局部变量只能在其被声明的函数内部访问
调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。
global 关键字:
指定当前变量使用外部的全局变量,那么就可以在函数内部修改外部的变量的值了。
如下在不是嵌套函数的函数中使用 global 关键字
输出结果:func 外部的变量 x 和内部重新赋值之前的 x 使用的是同一个值,修改之后,函数外部的 x 的值也被修改。
在嵌套函数中使用 global 关键字
-
如下如果未在函数内部重新定义 x,那么默认使用的是全局变量的 x
-
来修改一下 func 中 x 的值,看下 ifunc 中的 x 取值是谁?
输出结果:
-
再来修改一下 ifunc 中 x 的值,看看是否会影响 func 中 x 的值?
输出结果:
-
最后在嵌套函数 ifunc 中使用 global 关键字,看看有什么影响?
输出结果:
Python的规则是,如果在函数内部要修改一个变量,那么这个变量需要是内部变量,除非你用global声明了它是外部变量。如下示例:
Python函数的作用域取决于其函数代码块在整体代码中的位置,而不是调用时机的位置
nonlocal 关键字
使用 nonlocal 修饰后,变量是上一级函数中的局部变量。必须在嵌套函数中使用,并且在外层函数中定义了这个局部变量,否则会报错。
如下所示:把 ifunc 函数中的 global 改成 nonlocal
输出结果: