Hướng dẫn what is outermost scope in python? - phạm vi ngoài cùng trong python là gì?

Ảnh của Miram oh trên unplash

Nếu bạn giống như tôi, người có một vài tháng kinh nghiệm về Python, thì bạn có thể ở cùng vị trí với tôi - biết điều gì đó về Python, nhưng không đủ. Vì vậy, tôi đã dành một lúc để thu thập các bit và những mẩu kiến ​​thức rải rác để đào sâu hơn vào Python. Trong blog này, tác phẩm sẽ là phạm vi và đóng cửa.

Trong lập trình máy tính, phạm vi của một ràng buộc tên - một liên kết tên với một thực thể, chẳng hạn như một biến - là một phần của một chương trình mà liên kết tên là hợp lệ, đó là nơi có thể được sử dụng để chỉ thực thể. Trong các phần khác của chương trình, tên có thể đề cập đến một thực thể khác (nó có thể có một ràng buộc khác) hoặc không có gì cả (nó có thể không bị ràng buộc). - Wikiscope of a name binding — an association of a name to an entity, such as a variable — is the part of a program where the name binding is valid, that is where the name can be used to refer to the entity. In other parts of the program the name may refer to a different entity (it may have a different binding), or to nothing at all (it may be unbound). — wiki

Trong các ngôn ngữ lập trình, một đóng cửa, là một kỹ thuật để thực hiện ràng buộc tên phạm vi từ vựng trong một ngôn ngữ với các hàm hạng nhất. Hoạt động, đóng cửa là một bản ghi lưu trữ một chức năng cùng với một môi trường. Môi trường là một ánh xạ liên kết từng biến miễn phí của hàm (các biến được sử dụng cục bộ, nhưng được xác định trong phạm vi kèm theo) với giá trị hoặc tham chiếu mà tên được ràng buộc khi đóng. Không giống như một hàm đơn giản, việc đóng cho phép hàm truy cập các biến được ghi lại thông qua các bản sao đóng của các giá trị hoặc tài liệu tham khảo của chúng, ngay cả khi hàm được gọi bên ngoài phạm vi của chúng. - Wikiclosure, is a technique for implementing lexically scoped name binding in a language with first-class functions. Operationally, a closure is a record storing a function together with an environment. The environment is a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created. Unlike a plain function, a closure allows the function to access those captured variables through the closure’s copies of their values or references, even when the function is invoked outside their scope. — wiki

Nghe có vẻ khó hiểu? Hãy bắt đầu với phạm vi. Hãy nghĩ về nó như phạm vi giống như một con búp bê Nga nơi các biến được lưu trữ và từ đó chúng được tham chiếu. Trong ví dụ dưới đây,

  • Biến b là búp bê bên ngoài nhất và
  • a - Ngồi trong phạm vi chức năng outer, là con búp bê giữa, và
  • c, búp bê trong cùng trong phạm vi của inner
>>> b= 1
>>> def outer():
... a= 3
... print("outer: b=",b)
... def inner():
... c = a + b
... print("inner: b=",b)
... print("inner: a=",a)
... print("inner: c=",c)
... return inner()
============================
>>> outer()
outer: b= 3
inner: b= 3
inner: a= 1
inner: c= 4

Như bạn có thể thấy các biến được khai báo bên trong một hàm khác được ẩn khỏi phạm vi bên ngoài nhưng các biến trong phạm vi bên ngoài có thể truy cập trong phạm vi bên trong, giống như b có thể truy cập được từ cả inneroutera có thể truy cập được từ phạm vi lồng nhau của nó.

Lưu ý rằng thực tế là c có thể truy cập các biến được xác định ngoài phạm vi của chính nó, tức là, ba là những gì đóng cửa - truy cập các biến được xác định bên ngoài phạm vi hiện tại.closure is — accessing variables that are defined outside the current scope.

Hãy để tái cấu trúc mã để làm cho nó rõ ràng hơn:

>>> a = 1
>>> def outer(d):
... b = 3
... def inner():
... c = a + b + d
... print(c)
... return inner
>>> inner_value = outer(2)
>>> inner()
=========================
6

Bạn có thể đoán rằng sau khi chức năng outer được thực thi, biến b sẽ được thu thập rác, nhưng dường như phạm vi bên trong của `________ 18 vẫn có thể truy cập được vào ____ 19, hay còn gọi là.

>>> a = 1
>>> def outer():
... a = 3
... def inner():
... c = a * 2
... print(c)
... return inner
>>> inner_value = outer()
>>> inner()
=========================
6 # a = 3
0HAs một từ vựng trong phạm vi bên trong của
>>> a = 1
>>> def outer():
... a = 3
... def inner():
... c = a * 2
... print(c)
... return inner
>>> inner_value = outer()
>>> inner()
=========================
6 # a = 3
1, còn sống và được tham chiếu bởi
>>> a = 1
>>> def outer():
... a = 3
... def inner():
... c = a * 2
... print(c)
... return inner
>>> inner_value = outer()
>>> inner()
=========================
6 # a = 3
2.garbage-collected, but it seems thatthe inner scope of`
>>> a = 1
>>> def outer(d):
... b = 3
... def inner():
... c = a + b + d
... print(c)
... return inner
>>> inner_value = outer(2)
>>> inner()
=========================
6
8 is still accessible to
>>> a = 1
>>> def outer(d):
... b = 3
... def inner():
... c = a + b + d
... print(c)
... return inner
>>> inner_value = outer(2)
>>> inner()
=========================
6
9,aka.
>>> a = 1
>>> def outer():
... a = 3
... def inner():
... c = a * 2
... print(c)
... return inner
>>> inner_value = outer()
>>> inner()
=========================
6 # a = 3
0has a lexical closure over the inner scope of
>>> a = 1
>>> def outer():
... a = 3
... def inner():
... c = a * 2
... print(c)
... return inner
>>> inner_value = outer()
>>> inner()
=========================
6 # a = 3
1, which is alive and to be referenced by
>>> a = 1
>>> def outer():
... a = 3
... def inner():
... c = a * 2
... print(c)
... return inner
>>> inner_value = outer()
>>> inner()
=========================
6 # a = 3
2 .

Nhưng hãy để nói rằng phạm vi toàn cầu và phạm vi bên ngoài có một biến có cùng định danh. Đối với một phạm vi bên trong muốn tham chiếu biến này, cái nào sẽ được sử dụng?

>>> a = 1
>>> def outer():
... a = 3
... def inner():
... c = a * 2
... print(c)
... return inner
>>> inner_value = outer()
>>> inner()
=========================
6 # a = 3

Vậy mức độ của phạm vi được quyết định như thế nào?

Python giải quyết các tên bằng cách gọi là quy tắc LegB, viết tắt của địa phương, bao quanh, toàn cầu và tích hợp:LEGB rule, which stands for Local, Enclosing, Global, and Built-in:

Python Legb
  • Phạm vi cục bộ (hoặc chức năng) là khối mã hoặc phần thân của bất kỳ chức năng Python hoặc biểu thức
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    3 nào.
    is the code block or body of any Python function or
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    3 expression.
  • Phạm vi bao quanh (hoặc không thuộc địa) là một phạm vi chỉ tồn tại cho các chức năng lồng nhau. is a scope that only exists for nested functions.
  • Phạm vi toàn cầu (hoặc mô-đun) là phạm vi ngoài cùng trong tập lệnh Python hoặc mô-đun. Trong nội bộ, trình biên dịch biến tập lệnh chính thành một mô -đun có tên là
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    4 cho việc thực thi chương trình chính. Không gian tên của mô -đun này là phạm vi toàn cầu chính của chương trình của bạn.
    is the outer-most scope in Python script, or module. Internally, the compiler turns main script into a module called
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    4 for the main program’s execution. The namespace of this module is the main global scope of your program.
  • Phạm vi tích hợp là một phạm vi đặc biệt mà tự động tải bởi Python bất cứ khi nào bạn chạy tập lệnh hoặc mở phiên tương tác. Nó được triển khai như một mô -đun thư viện tiêu chuẩn có tên
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    5 trong Python 3.x. Tất cả các đối tượng tích hợp Python, sống trong mô-đun này, ví dụ:
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    6
    is a special scope that’s automatically loaded by Python whenever you run a script or open an interactive session. It’s implemented as a standard library module named
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    5 in Python 3.x. All of Python’s built-in objects live in this module, e.g.
    >>> a = 1
    >>> def outer():
    ... a = 3
    ... def inner():
    ... c = a * 2
    ... print(c)
    ... return inner
    >>> inner_value = outer()
    >>> inner()
    =========================
    6 # a = 3
    6

Vì vậy, khi một biến được tham chiếu, trình biên dịch đầu tiên tìm kiếm phạm vi trong cùng, sau đó nó đi lên từng cấp một, cho đến khi tiếp cận với phạm vi ngoài cùng. Nó sẽ dừng lại khi tìm thấy trận đấu đầu tiên. Vì vậy, vấn đề có thể phát sinh khi định danh trong phạm vi bên trong, khối đó là phạm vi bên ngoài, và điều này được gọi là Shadow Shadowing.within the innermost scope, it then goes one level up one by one, until reach out to the outermost scope. It will stops when it finds the first match. So the problem can arise when the identifier in the inner scope “block”s that of the outer scope, and this is called “shadowing” .

Đó là khá nhiều của nó!

Chúc bạn đọc vui vẻ!

Phạm vi của Python là gì?

Một biến chỉ có sẵn từ bên trong khu vực nó được tạo ra. Đây được gọi là phạm vi.. This is called scope.

Các loại 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ụ: địa phương, bao quanh, toàn cầu và tích hợp. Các phạm vi này cùng nhau tạo thành cơ sở cho quy tắc LEGB được sử dụng bởi trình thông dịch Python khi làm việc với các biến.local, enclosing, global, and built-in. These scopes together form the basis for the LEGB rule used by the Python interpreter when working with variables.

Phạm vi bao quanh trong Python?

Phạm vi bao quanh còn được gọi là phạm vi không địa phương. Họ đề cập đến tên của một biến được xác định trong hàm lồng nhau. Nói một cách đơn giản, các biến này không có trong phạm vi địa phương cũng như trong phạm vi toàn cầu. Để tạo một biến không cục bộ trong phạm vi kèm theo, hãy sử dụng từ khóa không cục bộ.

Ba loại phạm vi biến là gì?

PHP có ba phạm vi biến khác nhau: cục bộ. toàn cầu. tĩnh.local. global. static.

Phạm vi mặc định của biến trong Python là gì?

Theo mặc định, tất cả các biến được khai báo bên trong một hàm được coi là các biến cục bộ trong Python.Điều này có nghĩa là phạm vi của các biến này được giới hạn trong hàm đó và chúng không thể được truy cập hoặc sử dụng bên ngoài hàm đó.local variables in Python. This means the scope of these variables is limited to that function and they cannot be accessed or used outside that function.

Phạm vi toàn cầu và phạm vi địa phương trong Python là gì?

Các biến được xác định bên trong một cơ thể chức năng có phạm vi cục bộ và những biến được xác định bên ngoài có phạm vi toàn cầu.Điều này có nghĩa là các biến cục bộ chỉ có thể được truy cập bên trong hàm mà chúng được khai báo, trong khi các biến toàn cầu có thể được truy cập trên toàn bộ cơ thể chương trình bởi tất cả các chức năng.. This means that local variables can be accessed only inside the function in which they are declared, whereas global variables can be accessed throughout the program body by all functions.