Quy tắc legb trong python

Logic đằng sau phạm vi là phạm vi xác định khả năng truy cập của các biến, hàm, đối tượng, v.v. Nó trực tiếp phụ thuộc vào nơi bạn tạo ra chúng

Để hiểu thực sự cách phân giải phạm vi xảy ra trong Python, chúng ta nên phân tích quy tắc LEGB bởi vì, đó là chuỗi tên (biến, hàm, đối tượng, v.v.) mà Python phân giải trong một chương trình

LEGB là viết tắt của

(L) → Phạm vi cục bộ

(E) →Phạm vi kèm theo

(G) →Phạm vi toàn cầu

(B) → Phạm vi tích hợp

Như tôi đã đề cập trước đó, vì quy tắc LEGB hiển thị trình tự cách Python phân giải tên (biến, hàm, đối tượng, v.v.), điều quan trọng là phải nhớ nó từ (cao nhất (L) đến thấp nhất (B))

Phạm vi cục bộ (hoặc chức năng)

Phạm vi cục bộ đề cập đến tên (biến, hàm, v.v.) được xác định bên trong hàm. Nó có nghĩa là nó có thể truy cập được trong thời điểm nó được xác định cho đến khi kết thúc chức năng. Phạm vi cụ thể đó không thể được sửa đổi hoặc thậm chí truy cập bên ngoài chức năng. Như một ví dụ,

def example():
x="LEGB rule"
print(x)

example()

print(x)

Biến x chỉ có thể được truy cập bên trong hàm example(), vì vậy, khi chúng tôi cố gắng sử dụng nó dưới dạng print(x), nó sẽ không báo lỗi. Tuy nhiên, khi chúng tôi cố gắng tiếp cận nó từ bên ngoài hàm (bên dưới chúng tôi gọi là hàm ví dụ), sẽ xảy ra lỗi

NameError: name 'x' is not defined
LEGB rule

Đó là bởi vì, phạm vi cục bộ không hiển thị bên ngoài chức năng nơi nó được tạo

Phạm vi kèm theo (hoặc không cục bộ)

Phạm vi kèm theo là loại phạm vi chỉ tồn tại trong các hàm lồng nhau (Một hàm được xác định bên trong một hàm khác được gọi là hàm lồng nhau). Phạm vi kèm theo chỉ hiển thị cho các chức năng bên trong và kèm theo

def example():
x="outer function"

def example_inner():
y="inner function"
print(f"{x} // {y}")
print(x)
example_inner()
example()

Đây là đầu ra của chúng tôi,

outer function
outer function // inner function

Như chúng ta đã học trước đây vì lý do y là một phạm vi cục bộ, nó chỉ có thể được gọi bên trong example_inner(). Tuy nhiên, x là một phạm vi bao quanh, điều đó có nghĩa là nó có thể được gọi bên trong hàm example(), hơn nữa là bên trong hàm example_inner() (bởi vì, mặc dù thực tế nó là một hàm khác, nhưng nó vẫn nằm trong hàm example())

Phạm vi toàn cầu (hoặc mô-đun)

Phạm vi toàn cầu chứa tất cả các tên (biến, hàm, đối tượng, v.v.) mà bạn xác định ở mức cao nhất trong chương trình của mình. Điều đó có nghĩa là chúng ta có thể sử dụng tên đó từ bất cứ đâu chúng ta muốn

str="global function"

def example():

def example_inner():
print(str)
print(str)

example_inner()

example()

Đầu ra sẽ là,

global function
global function
Phạm vi tích hợp

Phạm vi tích hợp có khả năng truy cập rộng nhất trong số các phạm vi khác. Chúng tôi có thể đưa ra các ví dụ như từ khóa, chức năng và các thuộc tính khác được tích hợp trong Python (Chúng tôi có thể gọi các từ khóa ở bất kỳ đâu trong chương trình của mình mà không cần xác định chúng)

from math import pi

def example():
def example_inner():
print(pi)
print(pi)

example_inner()

example()
print(pi)

Mặc dù chúng tôi không gán pi cho bất kỳ giá trị nào, nhưng khi chúng tôi sử dụng nó như trong đoạn mã trên, chúng tôi sẽ nhận được kết quả là,

3.141592653589793
3.141592653589793
3.141592653589793

Xét cho cùng, logic của quy tắc LEGB là trình tự mà trình thông dịch Python tuân theo khi thực thi chương trình của bạn. Đầu tiên, nó kiểm tra gần nhất ( →Phạm vi cục bộ), nếu nó không tồn tại, di chuyển một bước đến ( →Phạm vi toàn cầu) và với logic tương tự, nó sẽ kiểm tra ( →Phạm vi toàn cầu) và ở cuối ( →Phạm vi tích hợp)

Hãy kiểm tra ví dụ nhanh để hiểu rõ hơn

________số 8

ĐẦU RA sẽ là,

Local scope
Global scope

Bởi vì khi chúng ta gọi hàm, chúng ta tạo một phạm vi cục bộ (“Phạm vi cục bộ”) và chúng ta cũng có một phạm vi toàn cầu (“Phạm vi toàn cầu”). Hàm ví dụ(x) ở vị trí đầu tiên xem liệu có phạm vi cục bộ hay không (có →“Phạm vi cục bộ”). Vì vậy, nó in "Phạm vi cục bộ"

Tuy nhiên, trong ví dụ này

NameError: name 'x' is not defined
LEGB rule
0

ĐẦU RA của chúng tôi là

NameError: name 'x' is not defined
LEGB rule
1

Lần này khi chúng ta gọi một hàm, chúng ta không tạo bất kỳ phạm vi cục bộ nào. Hàm example() một lần nữa, trước tiên kiểm tra phạm vi cục bộ (không có), sau đó tiến lên một bước và kiểm tra phạm vi toàn cục (“Phạm vi toàn cầu”). Vì vậy, nó in "Phạm vi toàn cầu"