Độ phân giải phạm vi trong ví dụ Python

Một biến được tạo bên trong một hàm thuộc phạm vi cục bộ của hàm đó và chỉ có thể được sử dụng bên trong hàm đó

Thí dụ

Một biến được tạo bên trong một hàm có sẵn bên trong hàm đó

def myfunc[].
  x = 300
  print[x]

myfunc[]

Tự mình thử »

Chức năng Bên trong Chức năng

Như đã giải thích trong ví dụ trên, biến

NameError: name 'x' is not defined
LEGB rule
2 không có sẵn bên ngoài hàm, nhưng nó có sẵn cho bất kỳ hàm nào bên trong hàm

Thí dụ

Biến cục bộ có thể được truy cập từ một hàm bên trong hàm

def myfunc[].
  x = 300
  def myinnerfunc[].
    print[x]
  myinnerfunc[]

myfunc[]

Tự mình thử »

Phạm vi toàn cầu

Một biến được tạo trong phần thân chính của mã Python là một biến toàn cục và thuộc về phạm vi toàn cầu

Các biến toàn cầu có sẵn từ bên trong bất kỳ phạm vi nào, toàn cục và cục bộ

Thí dụ

Một biến được tạo bên ngoài một hàm là biến toàn cục và có thể được sử dụng bởi bất kỳ ai

x = 300

def myfunc[].
  in[x]

myfunc[]

in[x]

Tự mình thử »

Đặt tên biến

Nếu bạn thao tác với cùng một tên biến bên trong và bên ngoài một hàm, Python sẽ coi chúng là hai biến riêng biệt, một biến có sẵn trong phạm vi toàn cục [bên ngoài hàm] và một biến có sẵn trong phạm vi cục bộ [bên trong hàm]

Thí dụ

Hàm sẽ in

NameError: name 'x' is not defined
LEGB rule
2 cục bộ, sau đó mã sẽ in
NameError: name 'x' is not defined
LEGB rule
2 toàn cầu

x = 300

def myfunc[].
  x = 200
  print[x]

myfunc[]

in[x]

Tự mình thử »

từ khóa toàn cầu

Nếu bạn cần tạo một biến toàn cục, nhưng bị mắc kẹt trong phạm vi cục bộ, bạn có thể sử dụng từ khóa

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

Từ khóa

NameError: name 'x' is not defined
LEGB rule
5 biến biến thành toàn cầu

Thí dụ

Nếu bạn sử dụng từ khóa

NameError: name 'x' is not defined
LEGB rule
5 thì biến thuộc phạm vi toàn cục

def myfunc[].
  toàn cầu x
  x = 300

myfunc[]

in[x]

Tự mình thử »

Ngoài ra, hãy sử dụng từ khóa

NameError: name 'x' is not defined
LEGB rule
5 nếu bạn muốn thay đổi một biến toàn cục bên trong một hàm

Thí dụ

Để thay đổi giá trị của một biến toàn cục bên trong một hàm, hãy tham chiếu đến biến đó bằng cách sử dụng từ khóa

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

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 địa phương"

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ầu [“Phạm vi toàn cầu”]. Vì vậy, nó in "Phạm vi toàn cầu"

Ví dụ về độ phân giải phạm vi trong Python là gì?

Độ phân giải phạm vi trong Python tuân theo quy tắc LEGB. L, Local — Các tên được gán theo bất kỳ cách nào trong một hàm [hoặc lambda] và không được khai báo toàn cục trong hàm đó. E, Các hàm cục bộ kèm theo - Tên trong phạm vi cục bộ của bất kỳ và tất cả các hàm [hoặc lambdas] tĩnh kèm theo, từ bên trong ra bên ngoài

Quy tắc phân giải tên trong Python là gì?

Độ phân giải tên của Python đôi khi được gọi là quy tắc LGB, sau tên phạm vi. Khi bạn sử dụng một tên không đủ tiêu chuẩn bên trong một hàm, Python sẽ tìm kiếm ba phạm vi—cục bộ [L], sau đó là toàn cầu [G], rồi đến tích hợp sẵn [B]—và dừng lại ở . .

Ba phạm vi trong Python là gì?

Bạn sẽ tìm hiểu về bốn phạm vi khác nhau với sự trợ giúp của các ví dụ. cục bộ, kèm theo, toàn cầu và tích hợp sẵn . Các phạm vi này cùng nhau tạo thành cơ sở cho quy tắc LEGB được trình thông dịch Python sử dụng khi làm việc với các biến.

Python giải quyết phạm vi của tên hoặc số nhận dạng như thế nào?

Câu trả lời. Độ phân giải phạm vi cho một tên nhất định bắt đầu từ hàm bên trong nhất và sau đó tăng dần lên cho đến khi chương trình tìm thấy đối tượng liên quan. Nếu quá trình tìm kiếm kết thúc mà không có kết quả nào, thì chương trình sẽ đưa ra một ngoại lệ NameError

Chủ Đề