1. 程式人生 > Python進階應用教學 >22 Python 中的作用域

22 Python 中的作用域

變數的作用域是指變數的作用範圍,是程式可以訪問該變數的正文區域。例如:

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 行的文字區域

1.3 Global 作用域

Global 作用域是能夠訪問全域性變數的正文區域。示例說明 Global 作用域:

global_var = 123

def function():
    print(global_var)

print(global_var)
  • global_var 是全域性變數
    • 它的作用域型別是 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 行的文字區域

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 行的文字區域