1. 程式人生 > 實用技巧 >變數的名稱空間及作用域與區域性作用域修改全域性變數

變數的名稱空間及作用域與區域性作用域修改全域性變數

1.名稱空間和作用域
名稱空間:變數名稱與值的對映關係
作用域:變數作用的區域,即範圍。

注意:class/def/模組會產生作用域;分支語句,迴圈語句,異常處理語句不會產生新的作用域。

2.作用域的型別區分
  • 名稱空間:變數名稱與值的對映關係
  • 作用域:變數作用的區域,範圍。
  • 作用域分型別:
    • 區域性作用域:
    • 巢狀作用域:
    • 全域性作用域
    • 內建作用域:
型別表示方式簡稱
區域性作用域 Local L
巢狀作用域 Enclosing E
全域性作用域 Global G
內建作用域 Builtin B
# 全域性變數
name = "小張"  # 全域性作用域
def fun():
    # 巢狀作用域
    age = 20
    def fun02():
        print("xxxx")

# print內建作用域內
print(name)
# 說出變數的作用域
a = 1  # 全域性作用域

def sum_num():
    c = 2  # 巢狀作用域

    def inner():
        d = 3  # 區域性作用域
        print(d)
    print(c)

# 內建作用域
print(a)

3.LEGB法則

區域性 > 巢狀 > 全域性 > 內建


4.區域性作用域變數的特點
  • 區域性變數只能在區域性訪問
def fun():
    a = 10
    print(a)

fun()
  • 函式執行,開闢棧幀,在函式棧幀存活期間,訪問區域性變數,可以訪問得到,如果函式棧幀銷燬,則所有資料物件銷燬。

5.區域性作用域內修改全域性變數
  • 需要在區域性作用域內生命全域性變數
5.1 可變型別
list01 = [1, 2, 3, 4, 5, 6]
def fun01():
    # global 宣告
    list01.append(0)
    print(list01) # [1, 2, 3, 4, 5, 6, 0]

fun01()
print(list01)  # [1, 2, 3, 4, 5, 6, 0]
5.2 不可變型別
a = 10

def fun():
    # 在區域性作用域修改全域性變數
    # 兄弟,我這裡宣告的是一個全域性變數
    global a  # 宣告在區域性作用域內建立一個全域性變數
    a = 20
    print(a)  # 20

fun()
print(a)  # 20

當在區域性作用域內修改全域性變數時,如果全域性變數為不可變型別,需要使用global生命全域性變數,才可以修改;如果全域性變數為可變型別,可以直接修改。


6.總結
- 名稱空間與作用域
- 作用域型別:LEGB
- LEGB法則
- 區域性作用域內修改全域性變數
- 可變型別:直接修改
- 不可變數:global
在區域性修改全域性的:global
在區域性修改巢狀的:nonlocal