1. 程式人生 > 其它 >Python:變數的作用域與LEGB原則

Python:變數的作用域與LEGB原則

技術標籤:Python

文章目錄

函式是Python中的第一類物件 ,可以把函式賦值給變數,對該變數進行呼叫,可實現原函式的功能。
(變數——函式——函數語言程式設計)

1. 作用域 / 名稱空間

1.1 作用域的定義

作用域:程式建立、訪問、改變一個變數時,都是在一個儲存該變數的空間內進行,這個空間為名稱空間,即作用域
python作用域是靜態的變數被賦值、建立的位置決定了其被訪問的範圍,即變數作用域由其所在位置決定

1.2 作用域的前提

Python中,作用域的概念僅僅存在

於:當變數在Module(模組)、Class(類)、def(函式) 中定義的時候

理解這一點至關重要! 對於LEGB原則準確、快速的理解很有幫助。

再說的直白點,作用域存在於 defclass之內的縮排程式碼塊 .py字尾Python檔案中!

2. LEGB 原則

Python 的變數名解析機制也稱為 LEGB 法則:

  • local(本地):理解為function,即作用域為函式內部
  • Enclosed(巢狀)理解為Enclosing function locals,即作用域為外部巢狀函式
  • Global(全域性):理解為module,即作用域為模組
  • Built-in(內建):即作用域為Python內建模組

注: 我們平時所說的”區域性變數“應該是包括這裡對的local和enclosed,即相對於全域性變數的說法(個人想法)

  • LEGB的作用——規定作用域的查詢順序
    local—>enclosing function locals—>global—>builtin
    在這裡插入圖片描述

    Python 的變數名解析機制也稱為 LEGB 法則,具體如下: 當在函式中使用未確定的變數名時,Python 搜尋 4 個作用域:本地作用域(L),之後是上一層巢狀結構中 def 或 lambda 的本地作用域(E),之後是全域性作用域(G),最後是內建作用域(B)。按這個查詢原則,在第一處找到的地方停止。如果沒有找到,Python會報錯的。

3. 例項

  • 全域性

    # Global
    s = 'Robin'
    def f1():
      print(s)
    def f2():
      s = 'pbb'
      f1()
    
    f1()
    
    

    結果是全域性變數Robin

  • 巢狀

    # Enclosed
    s = 'Robin'
    def f1():
        s = 'pbb'
        def f2():
            print(s)
        return f2()
    
    f1()
    

    結果是內部函式f2的區域性引數pbb,而不是全域性引數Robin

  • 本地

    # Local
    
    def f1():
      s = 'Robin'
      print(s)
    def f2():
      s = 'pbb'
      f1()
    
    f1()
    

    結果:

    Robin
    
  • 內建模組

    # Built-in
    import math  # 引入了內建模組
    
    pi = math.pi # 可以直接使用math這個指向內建模組的變數
    print(pi)
    

這一塊也可以先參考之前的記錄,以後有空再對”變數“這個東西做一個總結