Python tuân theo quy tắc LEGB (từ hẹp đến rộng) để tìm biến:
LEGB Rule
- L - Local: Biến định nghĩa trong hàm hiện tại (kể cả tham số).
- E - Enclosing: Biến trong hàm bao ngoài (nested function / closure).
- G - Global: Biến ở cấp độ module (file), khai báo ngoài mọi hàm.
- B - Built-in: Tên có sẵn khi interpreter khởi động (
len,print,Exception...).
Ví dụ minh họa
x = "global" # G
def outer():
x = "enclosing" # E
def inner():
x = "local" # L
print(x) # Tìm: L -> E -> G -> B
inner()
print(x) # E
outer()
print(x) # G
Đầu ra
local enclosing global
Từ khóa global và nonlocal
global x: Khai báoxthuộc scope Global (module).nonlocal x: Khai báoxthuộc scope Enclosing (hàm bao ngoài), không phải Global.
x = 0
def outer():
x = 1
def inner():
nonlocal x
x = 2
inner()
print(x) # 2 (thay đổi enclosing)
outer()
print(x) # 0 (global không đổi)
Lưu ý: Gán giá trị cho biến trong hàm tự động tạo biến local, trừ khi khai báo global/nonlocal.