1. 程式人生 > 實用技巧 >CFG——ControlFlowGuard 控制流保護

CFG——ControlFlowGuard 控制流保護

名稱空間

  • 名稱空間(namespaces):用於存放名字與記憶體地址繫結關係的地方,是對棧區的劃分
  • 作用:名稱空間可以使棧區中存放相同的名字,從而解決命名衝突
  • 名稱空間分為三種:
    1. 內建名稱空間
    2. 全域性名稱空間
    3. 區域性名稱空間

內建名稱空間

  • 內建名稱空間:用於存放Python直譯器中內建的名字
  • 生命週期:Python直譯器啟動則產生,Python直譯器關閉則銷燬
  • 例如:printinputint ...

全域性名稱空間

  • 全域性名稱空間:執行頂級程式碼所產生的名字,或者說除函式內定義以及內建的外,剩下的都是全域性名稱空間
  • 生命週期:Python檔案執行時產生,Python檔案執行完畢後銷燬
  • 例如:
# 變數名a
a = 1

# 函式名func
def func():
	pass

# 類名MyClass
class MyClass:
	pass

區域性名稱空間

  • 區域性名稱空間:在呼叫函式時,執行函式體程式碼過程中產生的函式內的名字
  • 生命週期:函式呼叫時產生,函式呼叫完畢後銷燬
  • 例如:
def func(x, y):
    pass

func(1, 2)

名稱空間的先後順序

  • 名稱空間載入順序:內建名稱空間 -> 全域性名稱空間 -> 區域性名稱空間
  • 名稱空間銷燬順序:區域性名稱空間 -> 全域性名稱空間 -> 內建名稱空間
  • 名字的查詢優先順序:從當前所在位置向上一層一層查詢

作用域

全域性作用域

  • 全域性作用域:內建名稱空間、全域性名稱空間
  • 特點:
    1. 全域性存活
    2. 全域性有效:被所有函式共享

區域性作用域

  • 區域性作用域:區域性名稱空間
  • 特點:
    1. 臨時存活
    2. 區域性有效:函式內有效

LEGB原則

找尋變數的呼叫順序採用LEGB原則(即就近原則)
B —— Builtin(Python);Python內建模組的名稱空間 (內建作用域)
G —— Global(module); 函式外部所在的名稱空間 (全域性作用域)
E —— Enclosing function locals;外部巢狀函式的作用域(巢狀作用域)
L —— Local(function);當前函式內的作用域 (區域性作用域)
依據就近原則,從下往上 從裡向外 依次尋找

global與nonlocal

  • global:宣告全域性變數獲修改全域性變數
  • nonlocal:修改區域性變數(當前函式上一層的區域性變數)
# global的使用
x = 1
def func():
	global x
	x = 2
func()
print(x)

# nonlocal的使用
def func1():
	x = 1
	def func2():
		nonlocal x
		x = 2
	func2()
	print(x)
func1()

總結

  1. 名稱空間是對棧的一種劃分,真正存在的是棧區。名稱空間只是一種虛擬的劃分
  2. 名稱空間只有優先順序之分,並無沒有巢狀關係
  3. 名稱空間的“巢狀關係”決定了名字的查詢順序
  4. 名稱空間的“巢狀關係”以函式定義階段為準