CÔNG CỤ
MODULES
THAM KHẢO
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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ả outerinner đề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 outerinner:

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.

Python nonlocal Scopes png

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:

Python nonlocal Scopes Variable Lookup png

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.

Python nonlocal Scopes nonlocal variable lookup png

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.

Cùng chuyên mục:

Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar

Cách dùng lớp QStatusBar trong PyQt để tạo thanh status bar

Cách dùng lớp QDockWidget của PyQt để tạo một widget

Cách dùng lớp QDockWidget của PyQt để tạo một widget

Cách dùng lớp PyQt QToolBar để tạo các widget toolbar

Cách dùng lớp PyQt QToolBar để tạo các widget toolbar

Cách sử dụng lớp PyQt QMenu để tạo menu

Cách sử dụng lớp PyQt QMenu để tạo menu

Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ

Cách sử dụng lớp QMainWindow của PyQt để tạo cửa sổ

Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file

Cách dùng lớp PyQt QFileDialog để tạo hộp thoại chọn file

Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu

Cách dùng lớp PyQt QInputDialog để tạo một hộp thoại nhập liệu

Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại

Cách sử dụng lớp PyQt QMessageBox để tạo một hộp thoại

Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar

Cách sử dụng lớp PyQt QProgressBar để tạo một widget progress bar

Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa

Cách dùng lớp PyQt QTextEdit để tạo một widget cho phép chỉnh sửa

Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề

Cách dùng lớp PyQt QGroupBox để tạo một khung nhóm với tiêu đề

Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab

Cách dùng lớp PyQt QTabWidget để tạo một widget dạng tab

Cách dùng PyQt QWidget để làm container chứa các widget khác.

Cách dùng PyQt QWidget để làm container chứa các widget khác.

Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider).

Cách sử dụng lớp PyQt QSlider để tạo một widget thanh trượt (slider).

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập ngày và giờ sử dụng PyQt QDateTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập giờ sử dụng lớp PyQt QTimeEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách tạo một widget nhập ngày sử dụng lớp PyQt QDateEdit

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Cách sử dụng widget PyQt QSpinBox để tạo một spin box

Sử dụng PyQt QComboBox để tạo Widget Combobox

Sử dụng PyQt QComboBox để tạo Widget Combobox

Cách sử dụng lớp PyQt QRadioButton

Cách sử dụng lớp PyQt QRadioButton

Top