Các loại phạm vi trong Python là gì?

Trước khi hiểu phạm vi giống như thế nào trong python, chúng ta cần làm quen với các không gian tên và chúng khác với phạm vi như thế nào. Hãy thảo luận ngắn gọn về chúng

Dựa theo

  • Không gian tên xác định định danh nào [biến, lớp, hàm, v.v.] có sẵn để sử dụng
  • Phạm vi là vùng văn bản của chương trình Python nơi không gian tên có thể truy cập trực tiếp

Hãy tìm hiểu sâu hơn một chút

Khi bạn khai báo một biến, python theo dõi 'tên' và 'giá trị' của nó bằng cách tạo một đối tượng và thêm đối tượng này vào từ điển nội bộ. Từ điển nội bộ này phục vụ như một cơ chế tra cứu cho python. Khi bạn cố gắng truy cập một biến, trình thông dịch python sẽ xem tên của nó trong từ điển nội bộ này và trả về giá trị của nó nếu tìm thấy. Nếu không tìm thấy, nó sẽ báo lỗi

a = 1 # namespace {a: 1}
# a now exists in the namespace
print[a] # 1
# b does not exist in the namespace yet
print[b] # => NameError: name b is not defined
b = 16
# b now exists in the namespace
print[b] # 16

Do đó, các đối tượng của từ điển này chính xác là không gian tên

Tuy nhiên, trong khi chương trình python đang chạy, nhiều không gian tên tồn tại tại thời điểm đó. Trong số các không gian tên này, các không gian tên cụ thể mà bạn sẽ có quyền truy cập được xác định bởi phạm vi mà bạn đang ở trong đó

Do đó quay trở lại định nghĩa của phạm vi theo

“Phạm vi là một vùng văn bản của chương trình Python nơi không gian tên có thể truy cập trực tiếp”

Nói một cách đơn giản, phạm vi là khu vực trong chương trình quyết định không gian tên cụ thể nào [trong số tất cả nhiều không gian tên hiện có trong thời gian nhất định] mà bạn sẽ có quyền truy cập

Các loại Phạm vi Python & Quy tắc LEGB

  • Hóa ra, có bốn loại phạm vi trong Python. LEGB => Local-Enclosure-Global-BuiltIn và quy tắc LEGB xác định thứ tự phạm vi mà trình thông dịch xem xét để truy xuất tên biến & giá trị từ

  • Trong Python, khi bạn cố gắng đọc một biến, trình thông dịch python sẽ truy xuất biến tương ứng bằng cách tra cứu tuần tự theo thứ tự phạm vi LEGB, i. e. lần xuất hiện đầu tiên của biến này được tìm thấy trong bất kỳ phạm vi nào bắt đầu tuần tự từ, Cục bộ -> Kèm theo -> Toàn cầu -> Tích hợp, sẽ được trả về

    Hãy hiểu từng phạm vi trong python là gì. Ghi chú. mỗi phạm vi trong chuỗi LEGB ít cụ thể hơn phạm vi trước đó
  • Phạm vi cục bộ. phạm vi cục bộ được xác định bởi nơi biến đã được xác định. Ví dụ. nếu biến đã được xác định bên trong một hàm, thì phạm vi cục bộ của nó sẽ chỉ được xác định là khối của hàm đó, trong khi nếu biến đã được xác định ở cấp cao nhất, thì nó sẽ được xem xét trong Phạm vi toàn cục [được giải thích bên dưới]

Ví dụ 1 -

def func[]:
b = "I love interviewBit"
print[b] # will print the string stored in variable b
 
func[]
print[b] # nameError will be thrown as b exists only in func[]'s local scope

đầu ra

I love interviewBit
Traceback [most recent call last]:
  File “main.py”, line 6, in 
      print[b] # nameError will be thrown as b exists in func[]’s local scope’
NameError: name ‘b’ is not defined

Vì b chưa bao giờ được xác định ở cấp cao nhất [toàn cầu], nó chỉ có thể truy cập được trong phạm vi cục bộ của 'func[]'. Nó trả về một lỗi khi được truy cập bên ngoài phạm vi mà nó chưa bao giờ được xác định

  • Phạm vi kèm theo. còn được gọi là phạm vi không cục bộ, có thể được quan sát khi bạn lồng các hàm bên trong các hàm khác. Giả sử một hàm 'func1[]' có một biến 'a' và một hàm lồng nhau 'func2[]'. Đối với chức năng lồng nhau 'func2[]' này, 'a' không phải là toàn cục cũng không phải cục bộ. Do đó, phạm vi của biến 'a' bên trong 'func2[]' là phạm vi kèm theo, i. e. không toàn cầu cũng không cục bộ, đó là lý do tại sao nó còn được gọi là phạm vi không cục bộ

Ví dụ 2 –

def func1[]:
   a = 10
   def func2[]:
       print[a]
   func2[]
func1[]

đầu ra

  • suy nghĩ-1. Nhưng nếu trong Ví dụ-2, chúng ta gán lại biến 'a' là 20 trong 'func2[]' thì sao? . Lưu ý rằng 'func2[]' không bao giờ tồn tại trong phạm vi cục bộ của nó. Do đó, theo quy tắc LEGB, nó không tìm thấy 'a' trong phạm vi L mà tìm thấy nó trong phạm vi E, tôi. e. Phạm vi kèm theo*
  • Phạm vi toàn cầu. [còn được gọi là phạm vi mô-đun] khi bạn bắt đầu viết mã bằng python, bạn đang ở trong phạm vi toàn cầu. Phạm vi toàn cầu chính là không gian tên mà nó trỏ đến khi bạn bắt đầu viết mã python của mình. Ghi chú. khi bạn xác định một tên ở đầu mô-đun python của mình, thì tên đó chỉ toàn cầu cho mô-đun cụ thể đó;

Ví dụ 3 –

a = 10
def func1[]:
   print["inside func1 ", a]  # as a does not exist in the local scope of func1[], according to the LEGB rule, the interpreter looked into the global scope
 
func1[]
print["at local global scope ", a]

đầu ra

inside func1 10
at global scope 10
  • suy nghĩ-2. Nhưng nếu trong Ví dụ-3, chúng ta gán lại biến 'a' là 20 trong 'func1[]' thì sao? . Lưu ý ở đây, biến 'a' không tồn tại trong phạm vi cục bộ của 'func1[]', do đó theo quy tắc LEGB, nó không tìm thấy 'a' trong L [của LEGB], không tìm thấy trong E [của LEGB . e. Toàn cầu
  • Phạm vi tích hợp. Khi trình thông dịch python không thể tìm thấy một biến trong phạm vi Cục bộ, Kèm theo và Toàn cầu, cuối cùng nó sẽ tìm kiếm trong phạm vi dựng sẵn. Chúng tôi đang nhập 'pi' từ thư viện toán học trong ví dụ sau. 'pi' đã nhập này sẽ thuộc về phạm vi dựng sẵn. Lưu ý rằng số nhận dạng này sẽ không được xác định lại vì sau đó nó sẽ có sẵn cho trình thông dịch python được tìm nạp từ phạm vi cục bộ, kèm theo hoặc toàn cầu [tùy thuộc vào nơi nó đã được xác định lại]

Ví dụ 4 –

from math import pi
def func1[]:
   print['inside func1 ', pi]
pi = 10
'''

don't do this, it will redefine the builtin identifier, as then the builtin value won't be read, and redefined value will be read
'''
print['at global scope ', pi]
func1[]

đầu ra

at global scope 3.141592653589793
inside func1 3.141592653589793

Ghi chú. giả sử nếu số pi được định nghĩa lại là '10', tôi. e. 'pi = 10' ở cấp độ toàn cầu, thì trình thông dịch python sẽ luôn trả về số pi là 10. Bởi vì bây giờ nó sẽ không có sẵn ở L hoặc E mà là G i. e. phạm vi toàn cầu theo phạm vi LEGB. Và do đó B, tôi. e. phạm vi BuildIn, sẽ không bao giờ được xem xét

Quay trở lại với những suy nghĩ chúng ta đã có

suy nghĩ-1. Nhưng nếu trong Ví dụ-2, chúng ta gán lại biến 'a' là 20 trong 'func2[]' thì sao?

  • Chà, trong Ví dụ-2, khi gán lại biến 'a' thành 20 trong 'func2[]'. Python sẽ tạo một tên và giá trị trong từ điển nội bộ của nó để 'a' sẽ khả dụng cho phạm vi của func2 là 20. Tôi. e. nó sẽ định nghĩa 'a' trong phạm vi cục bộ của ' func2[]'. Điều đó có nghĩa là đối với 'func2[]', 'a' sẽ tồn tại trong cả phạm vi cục bộ và phạm vi kèm theo, nhưng vì Cục bộ xuất hiện trước theo trình tự trong quy tắc thứ tự LEGB, nên nó sẽ lấy giá trị từ 'a', được xác định trong phạm vi này
  • Minh họa lại ví dụ 2 với câu lệnh in mới

Ví dụ 5 –

________số 8

đầu ra

  • Chúng tôi quan sát thấy rằng khi cập nhật 'a' thành 20, 'a' được xác định lại trong phạm vi cục bộ của 'func2[]' và đó là những gì trình thông dịch python đọc đầu tiên cho 'func2[]', trong khi giá trị của 'a
  • Nhưng nếu chúng ta muốn. 'a' khi được cập nhật trong 'func2[]' cũng sẽ được cập nhật trong phạm vi 'func1[]'?
  • Ở đây, chúng tôi sẽ giới thiệu từ khóa 'nonlocal'

từ khóa không cục bộ

Từ khóa 'không cục bộ' được sử dụng để hoạt động trong các tình huống mà chúng tôi có các hàm lồng nhau. Sử dụng từ khóa nonlocal, chúng tôi hướng dẫn biến mà nó không thuộc về hàm bên trong. Hãy hiểu điều này với một ví dụ

Thêm từ khóa 'nonlocal' trong Ví dụ-5

Ví dụ 6 –

def func1[]:
   a = 10
   def func2[]:
       nonlocal a
       print['func2 ', a]
   func2[]
   print['func1 ', a]
func1[]

đầu ra

Khi so sánh đầu ra của Ví dụ-7 và Ví dụ-8, có thể thấy rằng khi từ khóa 'toàn cầu' được thêm vào, các thay đổi được thực hiện đối với 'a' trong 'func1[]' được phản ánh trên toàn cầu vì hiện tại 'a' chỉ tồn tại trong phạm vi toàn cầu. Tại sao vậy?

Phạm vi trong Python và các loại của nó là gì?

Trong Python, khái niệm phạm vi liên quan chặt chẽ với khái niệm không gian tên. Như bạn đã học, phạm vi Python xác định vị trí hiển thị tên trong chương trình của bạn . Phạm vi Python được triển khai dưới dạng từ điển ánh xạ tên cho các đối tượng. Những từ điển này thường được gọi là không gian tên.

3 loại phạm vi là gì?

JavaScript có 3 loại phạm vi. .
Phạm vi chặn
phạm vi chức năng
Phạm vi toàn cầu

Các loại phạm vi là gì?

Như đã đề cập ở trên, có hai loại phạm vi— phạm vi sản phẩm và phạm vi dự án .

Bốn loại phạm vi là gì?

Chúng ta đã học bốn loại phạm vi – phạm vi toàn cầu, phạm vi cục bộ, phạm vi kèm theo và phạm vi tích hợp .

Chủ Đề