Biến cục bộ và biến toàn cục trong Python

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 2 tháng 2, 2025

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àm example_function. Khi gọi hàm, biến x đượ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ến x 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ục x 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óa global x được sử dụng để thông báo rằng biến x 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ục x đượ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ến x 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ến x được tìm thấy trong phạm vi hàm con và có giá trị 30.
  • Trong outer_function, khi gọi inner_function, biến x của hàm con được in ra trước.
  • Sau khi inner_function kết thúc, biến x của outer_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.

Website Logo

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.

Bình luận

Website Logo

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

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ