變數的名稱空間及作用域與區域性作用域修改全域性變數
阿新 • • 發佈:2020-12-22
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