Hướng dẫn how many local scopes are there in a python program - có bao nhiêu phạm vi cục bộ trong một chương trình python


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.scope.


Phạm vi địa phương

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 chức năng đó:

def myfunc (): & nbsp; x = 300 & nbsp; in (x)
  x = 300
  print(x)

myfunc()

Hãy 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 x không có sẵn bên ngoài hàm, nhưng nó có sẵn cho bất kỳ chức năng nào 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 chức năng đó:

def myfunc (): & nbsp; x = 300 & nbsp; in (x)
  x = 300
  def myinnerfunc():
    print(x)
  myinnerfunc()

myfunc()

Hãy 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 x không có sẵn bên ngoài hàm, nhưng nó có sẵn cho bất kỳ chức năng nào bên trong hàm:

Biến cục bộ có thể được truy cập từ một hàm 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 chức năng đó:

def myfunc (): & nbsp; x = 300 & nbsp; in (x)

Hãy tự mình thử »
  print(x)

myfunc()

print(x)

Chức năng bên trong chức năng

Như đã giải thích trong ví dụ trên, biến x không có sẵn bên ngoài hàm, nhưng nó có sẵn cho bất kỳ chức năng nào bên trong hàm:

Biến cục bộ có thể được truy cập từ một hàm 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 chức năng đó:

def myfunc (): & nbsp; x = 300 & nbsp; in (x)

Hãy tự mình thử »
  x = 200
  print(x)

myfunc()

print(x)

Chức năng bên trong chức năng


Như đã giải thích trong ví dụ trên, biến x không có sẵn bên ngoài hàm, nhưng nó có sẵn cho bất kỳ chức năng nào bên trong hàm:

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

def myfunc (): & nbsp; x = 300 & nbsp; def myinnerfunc (): & nbsp; & nbsp; in (x) & nbsp; myinnerfunc ()

Thí dụ

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

def myfunc (): & nbsp; x = 300 & nbsp; in (x)
  global x
  x = 300

myfunc()

Hãy 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 x không có sẵn bên ngoài hàm, nhưng nó có sẵn cho bất kỳ chức năng 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 trong hàm:

def myfunc (): & nbsp; x = 300 & nbsp; in (x)

Hãy tự mình thử »
  global x
  x = 200

myfunc()

Hãy tự mình thử »

Hãy tự mình thử »



Quy tắc phạm vi trong các chức năng

Bây giờ chúng tôi đã bước lên để viết các chức năng của riêng mình, chúng tôi cần phải chính thức hơn một chút về những cái tên có ý nghĩa gì trong Python. Khi bạn sử dụng tên trong một chương trình, Python tạo ra, thay đổi hoặc tìm kiếm tên trong cái được gọi là không gian tên, một nơi có tên sống. Như chúng ta đã thấy, những cái tên trong mùa xuân Python tồn tại khi chúng được gán một giá trị. Bởi vì tên aren đã được tuyên bố trước thời hạn, Python sử dụng việc gán tên để liên kết nó với một không gian tên cụ thể. Bên cạnh mã bao bì, các chức năng thêm một lớp không gian tên bổ sung vào các chương trình của bạn theo mặc định, các tên được gán bên trong một hàm được liên kết với không gian tên hàm đó và không ai khác.

Đây là cách thức hoạt động của nó. Trước khi bạn bắt đầu viết các chức năng, tất cả các mã đã được viết ở cấp cao nhất của một mô-đun, do đó, các tên sống trong chính mô-đun hoặc được xây dựng theo định nghĩa của Python (ví dụ: ____ 10). [29] Các chức năng cung cấp một không gian tên lồng nhau (đôi khi được gọi là phạm vi), trong đó bản địa hóa các tên họ sử dụng, sao cho tên bên trong hàm đã giành được xung đột với các tên bên ngoài (trong một mô -đun hoặc hàm khác). Chúng tôi thường nói rằng các chức năng xác định phạm vi cục bộ và các mô -đun xác định phạm vi toàn cầu. Hai phạm vi có liên quan như sau:scope), which localizes the names they use, such that names inside the function won’t clash with those outside (in a module or other function). We usually say that functions define a local scope, and modules define a global scope. The two scopes are related as follows:

Mô -đun kèm theo là một phạm vi toàn cầu

Mỗi mô -đun là một phạm vi toàn cầu, một không gian tên nơi các biến được tạo (được gán) ở cấp cao nhất của tệp mô -đun trực tiếp.

Mỗi cuộc gọi đến một hàm là một phạm vi địa phương mới

Mỗi khi bạn gọi một hàm, bạn tạo một phạm vi địa phương mới, một không gian tên nơi các tên được tạo bên trong hàm thường được sống.

Tên được chỉ định là địa phương, trừ khi được tuyên bố toàn cầu

Theo mặc định, tất cả các tên được gán bên trong một định nghĩa hàm được đặt trong phạm vi cục bộ (không gian tên được liên kết với lệnh gọi hàm). Nếu bạn cần gán một tên sống ở cấp cao nhất của mô-đun bao quanh hàm, bạn có thể làm như vậy bằng cách khai báo nó trong một câu lệnh global bên trong hàm.

Tất cả các tên khác là toàn cầu hoặc tích hợp

Các tên không được gán một giá trị trong định nghĩa hàm được coi là toàn cầu (trong không gian tên mô-đun kèm theo) hoặc tích hợp (trong mô-đun được xác định trước mô-đun Python cung cấp).

Độ phân giải tên: Quy tắc LGB

Nếu phần trước nghe có vẻ khó hiểu, nó thực sự sôi sục đến ba quy tắc đơn giản:

  • Tên Tài liệu tham khảo Tìm kiếm tối đa ba phạm vi: cục bộ, sau đó là toàn cầu, sau đó tích hợp.

  • Tên bài tập tạo hoặc thay đổi tên cục bộ theo mặc định.

  • Bản đồ khai báo toàn cầu trên toàn cầu được gán cho một mô -đun kèm theo phạm vi.

Nói cách khác, tất cả các tên được gán bên trong một câu lệnh

y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
2 là người dân địa phương theo mặc định; Các chức năng có thể sử dụng toàn cầu, nhưng họ phải khai báo toàn cầu để thay đổi chúng. Độ phân giải tên Python đôi khi được gọi là quy tắc LGB, sau tên phạm vi:LGB rule, after the scope names:

  • Khi bạn sử dụng một tên không đủ tiêu chuẩn bên trong một hàm, Python tìm kiếm ba phạm vi phạm vi địa phương (l), sau đó là toàn cầu (g), và sau đó là tích hợp (b) và dừng ở nơi đầu tiên, tên được tìm thấy.

  • Khi bạn gán một tên trong một hàm (thay vì chỉ đề cập đến nó trong một biểu thức), Python luôn tạo hoặc thay đổi tên trong phạm vi cục bộ, trừ khi nó được tuyên bố là toàn cầu trong hàm đó.

  • Khi ở bên ngoài một hàm (tức là, ở cấp cao nhất của một mô-đun hoặc tại dấu nhắc tương tác), phạm vi cục bộ giống như toàn cầu một không gian tên mô-đun.

Hình 4.1 minh họa ba phạm vi Python. Như một bản xem trước, chúng tôi cũng muốn bạn biết rằng các quy tắc này chỉ áp dụng cho các tên đơn giản (chẳng hạn như

y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
3). Trong hai chương tiếp theo, chúng tôi sẽ thấy rằng các quy tắc cho các tên đủ điều kiện (chẳng hạn như
y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
4, được gọi là thuộc tính) sống trong một đối tượng cụ thể và do đó hoạt động khác nhau.attributes) live in a particular object and so work differently.

Hướng dẫn how many local scopes are there in a python program - có bao nhiêu phạm vi cục bộ trong một chương trình python

Hình & NBSP; 4-1. & NBSP; Quy tắc tra cứu phạm vi LGB

Thí dụ

Hãy cùng nhìn vào một ví dụ thể hiện các ý tưởng phạm vi. Giả sử chúng ta viết mã sau trong tệp mô -đun:

# global scope
X = 99                # X and func assigned in module: global
          
def func(Y):          # Y and Z assigned in function: locals
    # local scope
    Z = X + Y         # X is not assigned, so it's a global
    return Z

func(1)               # func in module: result=100

Mô -đun này và chức năng mà nó chứa, sử dụng một số tên để thực hiện kinh doanh của họ. Sử dụng các quy tắc phạm vi Python, chúng ta có thể phân loại các tên như sau:

Tên toàn cầu:

y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
5,
y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
6

y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
5 là toàn cầu bởi vì nó được gán ở cấp cao nhất của tệp mô -đun; Nó có thể được tham chiếu bên trong chức năng mà không được tuyên bố toàn cầu.
y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
6 là toàn cầu vì lý do tương tự; Câu lệnh
y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
2 gán một đối tượng hàm cho tên
y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule
6 ở cấp cao nhất của mô -đun.

Tên địa phương: x1, x2

x1 và x2 là cục bộ cho hàm (và chỉ tồn tại trong khi hàm chạy), vì cả hai đều được gán một giá trị trong định nghĩa hàm; x2 nhờ vào tuyên bố x6 và x1 vì các đối số luôn được thông qua bằng cách chuyển nhượng (nhiều hơn về điều này trong một phút).

Toàn bộ điểm đằng sau sơ đồ phân biệt tên này là các biến cục bộ đóng vai trò là tên tạm thời mà bạn chỉ cần trong khi một hàm đang chạy. Chẳng hạn, đối số x1 và kết quả bổ sung x2 chỉ tồn tại bên trong hàm; Họ không can thiệp vào không gian tên mô -đun kèm theo (hoặc bất kỳ chức năng nào khác, cho vấn đề đó). Sự khác biệt địa phương/toàn cầu cũng làm cho một chức năng dễ hiểu hơn; Hầu hết các tên mà nó sử dụng xuất hiện trong chính hàm, không phải ở một vị trí tùy ý nào đó trong một mô -đun. [30]

Tuyên bố toàn cầu

Tuyên bố global là điều duy nhất mà bất cứ điều gì giống như một tuyên bố trong Python. Nó nói với Python rằng một chức năng có kế hoạch thay đổi tên toàn cầu mà các tên sống trong phạm vi mô -đun kèm theo (không gian tên). Chúng tôi đã nói về global khi đã vượt qua; như một bản tóm tắt:

  • x2 có nghĩa là một tên ở cấp cao nhất của một tệp mô-đun.

  • Tên toàn cầu chỉ được khai báo nếu chúng được gán trong một hàm.

  • Tên toàn cầu có thể được tham chiếu trong một chức năng mà không được khai báo.

Tuyên bố global chỉ là từ khóa global, theo sau là một hoặc nhiều tên được phân tách bằng dấu phẩy. Tất cả các tên được liệt kê sẽ được ánh xạ vào phạm vi mô -đun kèm theo khi được gán hoặc tham chiếu trong phần thân hàm. Ví dụ:

y, z = 1, 2         # global variables in module

def all_global():
    global x        # declare globals assigned
    x = y + z       # no need to declare y,z: 3-scope rule

Ở đây, x, x6 và x7 đều là tất cả các toàn cầu bên trong hàm x8. x9and x7 là toàn cầu vì chúng không được gán trong chức năng; x là toàn cầu bởi vì chúng tôi đã nói như vậy: Chúng tôi đã liệt kê nó trong một tuyên bố global để ánh xạ nó vào phạm vi mô -đun một cách rõ ràng. Nếu không có global ở đây, x sẽ được coi là địa phương nhờ vào nhiệm vụ. Lưu ý rằng x6 và x7 không được tuyên bố toàn cầu; Quy tắc tra cứu LGB của Python tự động tìm thấy chúng trong mô -đun. Cũng lưu ý rằng x có thể không tồn tại trong mô -đun kèm theo trước khi chức năng chạy; Nếu không, sự gán trong hàm tạo x trong mô -đun.

Nhận việc học Python ngay bây giờ với nền tảng học tập O hèReilly.learning platform.

Các thành viên của O hèReilly trải nghiệm đào tạo trực tuyến trực tiếp, cộng với sách, video và nội dung kỹ thuật số từ gần 200 nhà xuất bản.nearly 200 publishers.

Có bao nhiêu phạm vi trong Python?

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.four different scopes with the help of examples: 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 địa phương trong Python là gì?

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 đó.

Có bao nhiêu phạm vi?

JavaScript có 3 loại phạm vi: Phạm vi khối.Phạm vi chức năng.Phạm vi toàn cầu.3 types of scope: Block scope. Function scope. Global scope.

Phạm vi địa phương và toàn cầu 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.