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 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

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

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

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QFormLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QGridLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng QVBoxLayout trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QLineEdit trong PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget QPushButton của PyQt

Cách sử dụng widget PyQt QLabel

Cách sử dụng widget PyQt QLabel

Tín hiệu và Khe (Signals & Slots) trong PyQt

Tín hiệu và Khe (Signals & Slots) trong PyQt

PyQt là gì? Tạo một chương trình

PyQt là gì? Tạo một chương trình "Hello World".

Ứng dụng System Tray với Tkinter

Ứng dụng System Tray với Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách hiển thị đồ thị từ thư viện Matplotlib trong Tkinter

Cách sử dụng Validate trong Tkinter

Cách sử dụng Validate trong Tkinter

Cấu trúc MVC trong Tkinter

Cấu trúc MVC trong Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Cách sử dụng widget PhotoImage của Tkinter

Top