Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Các phạm vi nonlocal trong Python
Trong bài viết này, bạn sẽ học về các phạm vi nonlocal trong Python và cách sử dụng từ khóa nonlocal
để thay đổi các biến của các phạm vi nonlocal. Kiến thức về phạm vi biến là một phần quan trọng trong việc hiểu cách Python quản lý và truy cập dữ liệu. Thông qua ví dụ minh họa, bạn sẽ thấy rõ cách hoạt động của các phạm vi nonlocal, cũng như cách sử dụng từ khóa nonlocal
để điều chỉnh các biến nằm ngoài phạm vi cục bộ hiện tại. Hãy cùng tìm hiểu và nắm bắt khái niệm này để nâng cao kỹ năng lập trình của bạn.
Giới thiệu về phạm vi nonlocal trong Python
Trong Python, bạn có thể định nghĩa một hàm bên trong một hàm khác. Ví dụ:
def outer(): print('outer function') def inner(): print('inner function') inner() outer()
Kết quả:
outer function inner function
Trong ví dụ này, mình đã định nghĩa một hàm gọi là outer
. Bên trong hàm outer
,mình định nghĩa một hàm khác gọi là inner
và gọi hàm inner
từ bên trong hàm outer
.
Bài viết này được đăng tại [free tuts .net]
Thông thường, mình nói rằng hàm inner
được lồng trong hàm outer
. Trên thực tế, bạn định nghĩa các hàm lồng nhau khi không muốn các hàm này là toàn cục.
Cả outer
và inner
đều có thể truy cập các phạm vi toàn cục và tích hợp, cũng như các phạm vi cục bộ của chúng.
Hàm inner
cũng có thể truy cập vào phạm vi bao quanh của nó, đó là phạm vi của hàm outer
.
Từ quan điểm của hàm inner
, phạm vi bao quanh của nó không phải là cục bộ cũng không phải là toàn cục. Python gọi đây là phạm vi nonlocal.
Hãy sửa đổi các hàm outer
và inner
:
def outer(): message = 'outer function' print(message) def inner(): print(message) inner() outer()
Kết quả:
outer function outer function
Khi gọi hàm outer
, Python tạo ra hàm inner
và thực thi nó.
Khi hàm inner
thực thi, Python không tìm thấy biến message
trong phạm vi cục bộ. Vì vậy, Python tìm kiếm nó trong phạm vi bao quanh, đó là phạm vi của hàm outer
.
Xem ví dụ sau:
message = 'global scope' def outer(): def inner(): print(message) inner() outer()
Kết quả:
global scope
Trong ví dụ này, Python tìm kiếm biến message
trong phạm vi cục bộ của hàm inner
.
Vì Python không tìm thấy biến này, nó tìm kiếm trong phạm vi bao quanh, đó là phạm vi của hàm outer
.
Và trong trường hợp này, Python tìm lên phạm vi toàn cục để tìm biến:
Từ khóa nonlocal trong Python
Để thay đổi các biến từ phạm vi nonlocal trong một phạm vi cục bộ, bạn sử dụng từ khóa nonlocal
. Ví dụ:
def outer(): message = 'outer scope' print(message) def inner(): nonlocal message message = 'inner scope' print(message) inner() print(message) outer()
Kết quả:
outer scope inner scope inner scope
Trong ví dụ này, mình sử dụng từ khóa nonlocal
để rõ ràng chỉ định với Python rằng đang thay đổi một biến nonlocal.
Khi bạn sử dụng từ khóa nonlocal
cho một biến, Python sẽ tìm kiếm biến đó trong chuỗi các phạm vi cục bộ bao quanh cho đến khi nó gặp biến đó.
Quan trọng hơn, Python sẽ không tìm kiếm biến trong phạm vi toàn cục.
Xem xét ví dụ sau:
message = 'outer scope' def outer(): print(message) def inner(): nonlocal message message = 'inner scope' print(message) inner() print(message) outer()
Nếu bạn chạy mã này, bạn sẽ nhận được lỗi sau:
SyntaxError: no binding for nonlocal 'message' found
Từ bên trong hàm inner
, sử dụng từ khóa nonlocal
cho biến message
.
Do đó, Python tìm kiếm biến message
trong phạm vi bao quanh, đó là phạm vi của hàm outer
.
Vì phạm vi của hàm outer
không có biến message
và Python không tìm kiếm xa hơn trong phạm vi toàn cục, nó phát sinh lỗi.
Kết bài
Phạm vi bao quanh của các hàm lồng nhau được gọi là phạm vi nonlocal. Để thay đổi biến từ các phạm vi nonlocal, bạn sử dụng từ khóa nonlocal
. Python sẽ tìm kiếm các biến nonlocal trong chuỗi các phạm vi cục bộ bao quanh, và sẽ không tìm kiếm biến trong phạm vi toàn cục. Việc hiểu và áp dụng đúng cách khái niệm này sẽ giúp bạn viết mã Python hiệu quả và chính xác hơn, đặc biệt trong các tình huống yêu cầu quản lý và truy cập biến phức tạp.