函数 - 变量作用域

作用域是指变量的有效作用范围。

  • 通常情况下,在编程语言中, 变量的作用域从代码的数据结构形式来看,有块级、函数、类、包、模块等从小到大的级别。

  • 但在 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

输出结果:

posted @ 2021-06-15 22:24  biubiubiu83  Views(293)  Comments(0Edit  收藏  举报