首发于测试吧啦

Python 中的局部变量与全局变量

​1、作用域的概念

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

  • 通常情况下,在编程语言中,变量的作用域从代码的数据结构形式来看,有块级、函数、类、包、模块等从小到大的级别
  • python 中没有块级作用域的概念,也就是 if、for 语句块是没有作用域的
  • 通常来讲,内部代码可以访问外部变量,而外部代码无法访问内部变量。变量的作用域决定了程序的哪一部分可以访问哪个特定的变量名称

python 中的作用域一共 4 层,在 python 中以 L->E->G->B 的规则查找变量:

  • L(Local):局部作用域
  • E(Enclosing):闭包函数外的函数中
  • G(Global):全局作用域
  • B(Built-In):内建作用域

2、全局变量和局部变量

  • 全局变量:在整个程序范围内都可以访问,定义在函数外的拥有全局作用域的变量。
  • 局部变量:只能在其被声明的函数范围内访问,定义在函数内部的一个拥有局部作用域的变量。

3、global 关键字

使用 global 关键字可以在函数内部指定当前变量使用外部的全局变量,这样就可以在函数内部修改外部的变量值了。

场景1:在不是嵌套函数的函数中使用 gloabl 关键字

如下输出结果,可以看到 func 外部的 x 和内部的 x 是同一个值,在函数内部修改之后,外部的 x 也被修改了:

场景2:在嵌套函数中使用 global 关键字

  • 如下,未在函数内部重新定义 x,那么默认使用全局变量 x
  • 来修改一下 func 中 x 的值,那么 ifunc 中的 x 取值是什么呢?

输出结果:

  • 再来修改一下 ifunc 中 x 的值,这会影响 func 中 x 的值嘛?(我猜不会)

输出结果:

  • 最后,我们看看在 ifunc 中使用 global 关键字,会有什么影响

输出结果:

python 的规则是如果要在函数内部修改一个变量,这个变量需要是内部变量,除非使用 global 关键字声明它,如下:

python 的作用域取决于其代码块在整体代码中的位置,而不是调用的时机。


4、nonlocal 关键字

使用 nonlocal 修饰后,变量是上一级函数中的局部变量。必须在嵌套函数中使用,并且在外层函数中定义了这个局部变量,否则会报错。如下所示:把 ifunc 函数中的 global 改成 nonlocal

输出结果:

发布于 2021-06-12 23:07