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.