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àmThí 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ầux = 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
5Từ khóa
NameError: name 'x' is not defined
LEGB rule
5 biến biến thành toàn cầuThí 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ụcdef 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àmThí 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
Phạm vi cục bộ [hoặc chức năng]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ộ đề 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 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ợpPhạ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
1Lầ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"