变量的作用域是指变量的作用范围,是程序可以访问该变量的正文区域。例如:

g = 123

def function():
    print(g)

print(g)
  • 程序总共有 6 行
  • 在第 1 行,定义了变量 g
  • 在第 4 行,在函数 function 内部访问变量 g
  • 在第 6 行,在全局范围访问变量 g

因为可以在程序的任意位置(从第 1 行到第 6行)访问到该变量,变量 g 的作用域就是从第 1 行到第 6行的正文区域。

1. 四种作用域

1.1 概述

在 Python 中,存在 4 种类型的作用域:

  • Builtin 作用域,能够访问内置函数和内置变量的正文区域
  • Global 作用域,能够访问全局变量的正文区域
  • Local 作用域,能够访问函数参数和局部变量的正文区域
  • Enclosing 作用域,如果函数是嵌套定义的,能够访问外部函数的参数和局部变量的正文区域

1.2 Builtin 作用域

Builtin 作用域是能够访问内置函数和内置变量的正文区域。示例说明 Builtin 作用域:

def function():
    print(max(1, 2))

print(max(3, 4))
  • max 是内置函数
  • 它的作用域类型是 Builtin 作用域
  • 在第 2 行,在函数 function 内访问它
  • 在第 4 行,在全局范围访问它
  • max 的作用域是从第 1 行到第 4 行的文本区域
  • 它的作用域类型是 Builtin 作用域
  • 在第 2 行,在函数 function 内访问它
  • 在第 4 行,在全局范围访问它

1.3 Global 作用域

Global 作用域是能够访问全局变量的正文区域。示例说明 Global 作用域:

global_var = 123

def function():
    print(global_var)

print(global_var)
  • global_var 是全局变量
  • 它的作用域类型是 Global 作用域
  • 在第 1 行,在全局范围访问它
  • 在第 4 行,在函数 function 内访问它
  • 在第 6 行,在全局范围访问它
  • 它的作用域类型是 Global 作用域
  • 在第 1 行,在全局范围访问它
  • 在第 4 行,在函数 function 内访问它
  • 在第 6 行,在全局范围访问它
  • global_var 的作用域是从第 1 行到第 6 行的文本区域

1.4 Local 作用域

Local 作用域是能够访问函数参数和局部变量的正文区域。示例说明 Local 作用域:

def function():
    local_var = 123
    print(local_var)

print(local_var)
  • local_var 是函数 function 的局部变量
  • 它的作用域类型是 Local 作用域
  • 在第 2 行,在函数 function 内访问它
  • 在第 3 行,在函数 function 内访问它
  • 在第 5 行,在函数 function 外访问变量
  • 只能在函数内部访问局部变量
  • 运行时会产生异常 NameError
  • local_var 的作用域是从第 2 行到第 3 行的文本区域
  • 它的作用域类型是 Local 作用域
  • 在第 2 行,在函数 function 内访问它
  • 在第 3 行,在函数 function 内访问它
  • 只能在函数内部访问局部变量
  • 运行时会产生异常 NameError

1.5 Enclosing 作用域

假设函数是嵌套定义的,Enclosing 作用域是能够访问外部函数的参数和局部变量的正文区域。示例说明 Local 作用域:

def outter():
    outter_var = 123
    def inner():
        inner_var = 456
        print(outter_var)

outter()
  • 函数嵌套定义
  • 函数 outter 是外部函数
  • 函数 inner 是内部函数
  • outter_var 是外部函数 outter 的局部变量
  • 它的作用域类型是 Encloing 作用域
  • 在第 2 行,在外部函数 outter 内访问它
  • 在第 5 行,在外部函数 inner 内访问它
  • outter_var 的作用域是从第 2 行到第 5 行的文本区域
  • 函数 outter 是外部函数
  • 函数 inner 是内部函数
  • 它的作用域类型是 Encloing 作用域
  • 在第 2 行,在外部函数 outter 内访问它
  • 在第 5 行,在外部函数 inner 内访问它