Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Phạm vi toàn cục, cục bộ và không cục bộ trong Python
Phạm vi (Scope) trong lập trình được hiểu là khu vực mà biến có thể được truy cập. Để đảm bảo tính bảo mật và hiệu quả, các ngôn ngữ lập trình cho phép lập trình viên xác định rõ phạm vi của biến. Trong Python, phạm vi của biến được chia thành ba loại chính: toàn cục (global), cục bộ (local), và không cục bộ (nonlocal). Hãy cùng tìm hiểu chi tiết qua bài viết này.

Phạm vi toàn cục (Global Scope) trong Python
Biến được định nghĩa bên ngoài tất cả các hàm không lồng nhau được gọi là biến toàn cục. Những biến này có thể được truy cập từ bất kỳ đâu trong chương trình.
Ví dụ:
side = 5  # Biến toàn cục
def area():
    return side * side
def circumference():
    return 4 * side
print(f"Diện tích hình vuông: {area()}")
print(f"Chu vi hình vuông: {circumference()}")
Kết quả:
Bài viết này được đăng tại [free tuts .net]
Diện tích hình vuông: 25 Chu vi hình vuông: 20
Tuy nhiên, khi một hàm cố gắng thay đổi giá trị của biến toàn cục, Python sẽ báo lỗi UnboundLocalError. Để giải quyết vấn đề này, bạn cần sử dụng từ khóa global để chỉ rõ rằng biến được thay đổi là biến toàn cục.
Ví dụ không dùng global
side = 5
def multiply_side(factor):
    side *= factor  # Cố gắng thay đổi biến toàn cục
multiply_side(7)
print(f"Chiều dài cạnh: {side}")
Kết quả:
UnboundLocalError: local variable 'side' referenced before assignment
Ví dụ có dùng global
side = 5
def multiply_side(factor):
    global side
    side *= factor  # Thay đổi giá trị biến toàn cục
multiply_side(7)
print(f"Chiều dài cạnh: {side}")
Kết quả:
Chiều dài cạnh: 35
Phạm vi cục bộ (Local Scope) trong Python
Mặc định, các biến được định nghĩa bên trong một hàm sẽ có phạm vi cục bộ. Điều này có nghĩa là chúng chỉ có thể được truy cập bên trong hàm đó và không tồn tại bên ngoài hàm.
Biến cục bộ sẽ bị hủy ngay sau khi hàm kết thúc.
Ví dụ:
side = 5
def area():
    square_area = side * side  # Biến cục bộ
print(square_area)
Kết quả:
NameError: name 'square_area' is not defined
Phạm vi không cục bộ (Nonlocal Scope) trong Python
Hàm lồng nhau (nested function) giới thiệu một loại phạm vi mới gọi là phạm vi không cục bộ. Khi một hàm con muốn chia sẻ biến với hàm cha, bạn cần sử dụng từ khóa nonlocal.
Trong trường hợp này, việc sử dụng global không giải quyết được vấn đề vì biến nằm trong phạm vi cục bộ của hàm cha.
Ví dụ không sử dụng nonlocal
side = 5
def half_area():
    area = side * side
    def divide():
        area /= 2  # Thay đổi biến của hàm cha
    divide()
    return area
print(half_area())
Kết quả:
UnboundLocalError: local variable 'area' referenced before assignment
Ví dụ sử dụng nonlocal:
side = 5
def half_area():
    area = side * side
    def divide():
        nonlocal area  # Chia sẻ biến với hàm cha
        area /= 2
    divide()
    return area
print(half_area())
Kết quả:
12.5
Kết bài
- Global Scope: Biến được khai báo bên ngoài tất cả các hàm, có thể truy cập từ bất kỳ đâu. Dùng từ khóa 
globalđể thay đổi giá trị. - Local Scope: Biến được khai báo trong hàm, chỉ tồn tại trong hàm đó.
 - Nonlocal Scope: Sử dụng trong các hàm lồng nhau khi cần chia sẻ biến giữa hàm cha và hàm con, dùng từ khóa 
nonlocalđể thay đổi giá trị. 
Hiểu rõ và quản lý phạm vi của biến sẽ giúp chương trình hoạt động ổn định, tránh các lỗi không mong muốn liên quan đến biến trong Python.

            Các kiểu dữ liệu trong C ( int - float - double - char ...)        
            Thuật toán tìm ước chung lớn nhất trong C/C++        
            Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)        
            ComboBox - ListBox trong lập trình C# winforms        
            Random trong Python: Tạo số random ngẫu nhiên        
            Lệnh cin và cout trong C++        
                Cách khai báo biến trong PHP, các loại biến thường gặp            
                Download và cài đặt Vertrigo Server            
                Thẻ li trong HTML            
                Thẻ article trong HTML5            
                Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên            
                Cách dùng thẻ img trong HTML và các thuộc tính của img            
                Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng