Biến cục bộ và biến toàn cục trong Python
Trong Python, biến được phân loại thành hai loại chính: biến cục bộ (local variables) và biến toàn cục (global variables). Sự khác biệt giữa chúng chủ yếu liên quan đến phạm vi và thời gian sống của biến.

1. Biến cục bộ (Local Variables)
Biến cục bộ là các biến được khai báo và sử dụng trong một hàm hoặc một khối mã cụ thể. Các biến này chỉ có thể được truy cập và sử dụng trong phạm vi hàm hoặc khối mã mà chúng được khai báo. Khi hàm hoặc khối mã kết thúc, các biến cục bộ sẽ bị xóa và không thể truy cập từ bên ngoài.
Cách khai báo và sử dụng biến cục bộ:
def example_function():
x = 10 # Biến cục bộ
print(x) # Sử dụng biến cục bộ
example_function()
# print(x) # Lỗi vì x là biến cục bộ và không thể truy cập từ bên ngoài hàm
Giải thích:
- Biến
x
được khai báo trong hàmexample_function
. Khi gọi hàm, biếnx
được tạo ra và in ra màn hình. - Sau khi hàm kết thúc, biến
x
không còn tồn tại, và nếu cố gắng truy cập biếnx
bên ngoài hàm, sẽ gặp lỗi.
2. Biến toàn cục (Global Variables)
Biến toàn cục là các biến được khai báo ở ngoài các hàm hoặc khối mã, tức là ở cấp độ toàn bộ chương trình. Các biến này có thể được truy cập và thay đổi từ bất kỳ đâu trong chương trình, bao gồm cả các hàm.
Cách khai báo và sử dụng biến toàn cục:
x = 10 # Biến toàn cục
def example_function():
print(x) # Truy cập biến toàn cục từ trong hàm
example_function() # In ra 10
Giải thích:
- Biến
x
được khai báo ở ngoài hàm, tức là biến toàn cục. - Hàm
example_function
có thể truy cập và in giá trị của biến toàn cụcx
mà không gặp vấn đề gì.
3. Biến toàn cục và việc thay đổi giá trị trong hàm
Nếu bạn muốn thay đổi giá trị của một biến toàn cục từ trong một hàm, bạn cần phải khai báo biến đó là toàn cục trong hàm bằng từ khóa global
.
Ví dụ thay đổi giá trị biến toàn cục trong hàm:
x = 10 # Biến toàn cục
def change_global():
global x # Khai báo biến toàn cục
x = 20 # Thay đổi giá trị biến toàn cục
print(x) # In ra 10
change_global()
print(x) # In ra 20, vì biến toàn cục x đã bị thay đổi
Giải thích:
- Biến
x
được khai báo là toàn cục bên ngoài hàm. - Trong hàm
change_global
, từ khóaglobal x
được sử dụng để thông báo rằng biếnx
mà hàm thao tác là biến toàn cục, không phải biến cục bộ. - Khi hàm
change_global
chạy, giá trị của biến toàn cụcx
được thay đổi từ 10 thành 20.
4. Biến cục bộ và biến toàn cục có thể trùng tên
Nếu bạn khai báo một biến cục bộ với tên giống với một biến toàn cục, thì biến cục bộ sẽ "che" (override) biến toàn cục trong phạm vi của hàm. Biến cục bộ này chỉ có thể được truy cập trong hàm, và biến toàn cục sẽ không bị ảnh hưởng ngoài hàm.
Ví dụ biến cục bộ và biến toàn cục trùng tên:
x = 10 # Biến toàn cục
def example_function():
x = 20 # Biến cục bộ
print(x) # Truy cập biến cục bộ
example_function() # In ra 20
print(x) # In ra 10, vì biến toàn cục không bị thay đổi
Giải thích:
- Trong hàm
example_function
, biếnx
là một biến cục bộ, giá trị của nó là 20. - Khi gọi hàm, giá trị của biến cục bộ
x
được in ra. - Biến toàn cục
x
không bị thay đổi bởi vì biến cục bộx
trong hàm "che" biến toàn cục này trong phạm vi hàm.
5. Quy tắc về phạm vi của biến
Quy tắc LEGB:
Python sử dụng một quy tắc gọi là LEGB để xác định phạm vi của một biến. Quy tắc này bao gồm 4 mức độ:
- L (Local): Biến cục bộ, khai báo trong hàm hoặc khối mã.
- E (Enclosing): Biến trong các hàm bao quanh (trong trường hợp có hàm lồng nhau).
- G (Global): Biến toàn cục, khai báo ngoài hàm.
-
B (Built-in): Biến có sẵn trong Python (như
print()
,len()
).
Khi Python tìm kiếm giá trị của một biến, nó sẽ theo thứ tự này: Local → Enclosing → Global → Built-in.
Ví dụ về quy tắc LEGB:
x = 10 # Biến toàn cục
def outer_function():
x = 20 # Biến trong hàm bao quanh
def inner_function():
x = 30 # Biến trong hàm con
print(x) # In ra 30
inner_function()
print(x) # In ra 20
outer_function()
print(x) # In ra 10
Giải thích:
- Trong
inner_function
, biếnx
được tìm thấy trong phạm vi hàm con và có giá trị 30. - Trong
outer_function
, khi gọiinner_function
, biếnx
của hàm con được in ra trước. - Sau khi
inner_function
kết thúc, biếnx
củaouter_function
(giá trị 20) được in ra. - Cuối cùng, biến toàn cục
x
(giá trị 10) được in ra ngoài hàm.
Kết luận
- Biến cục bộ là các biến được khai báo trong một hàm và chỉ có thể truy cập trong phạm vi của hàm đó.
- Biến toàn cục là các biến được khai báo ngoài hàm và có thể truy cập từ bất kỳ đâu trong chương trình.
- Việc sử dụng biến cục bộ và toàn cục phù hợp giúp bạn tổ chức mã nguồn một cách rõ ràng và dễ bảo trì.
Việc hiểu rõ sự khác biệt giữa biến cục bộ và biến toàn cục là rất quan trọng khi phát triển các ứng dụng Python, giúp kiểm soát phạm vi và thời gian sống của các biến trong chương trình.

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.
Xem thêm

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.
Liên hệ công việc qua email dưới đây.
lhvuctu@gmail.com