Có bao nhiêu phạm vi toàn cầu và cục bộ trong Python

Bây giờ chúng ta đã bắt đầu viết các hàm của riêng mình, chúng ta cần tìm hiểu chính thức hơn một chút về ý nghĩa của các tên trong Python. Khi bạn sử dụng một tên trong một chương trình, Python sẽ tạo, thay đổi hoặc tra cứu tên đó trong vùng được gọi là không gian tên—một nơi chứa các tên đó. Như chúng ta đã thấy, các tên trong Python tồn tại khi chúng được gán một giá trị. Bởi vì các tên không được khai báo trước, nên Python sử dụng phép 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ã đóng gói, các hàm thêm một lớp không gian tên bổ sung vào 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 của hàm đó và không có tên nào khác.

Đây là cách nó hoạt động. Trước khi bạn bắt đầu viết các hàm, tất cả mã được viết ở cấp cao nhất của một mô-đun, vì vậy các tên này hoặc nằm trong chính mô-đun hoặc được tích hợp sẵn mà Python định nghĩa trước [e. g. ,

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
1]. [] Các hàm cung cấp một không gian tên lồng nhau [đôi khi được gọi là phạm vi], giúp bản địa hóa các tên mà chúng sử dụng, sao cho các tên bên trong hàm sẽ không 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 ta 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

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 chức năng 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 cục bộ 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 tồn tại

Tên được gán là cục bộ, trừ khi được khai báo toàn cầu

Theo mặc định, tất cả các tên được gán bên trong đị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 chỉ định một tên nằm ở 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 tên đó trong 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 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 giá trị trong định nghĩa hàm được coi là tên toàn cục [trong không gian tên của mô-đun kèm theo] hoặc tích hợp sẵn [trong mô-đun tên được xác định trước mà 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, thì nó thực sự rút gọn thành ba quy tắc đơn giản

  • Tên tài liệu tham khảo tìm kiếm nhiều nhất ba phạm vi. cục bộ, sau đó toàn cầu, sau đó được tích hợp sẵn

  • Đặt tên tạo hoặc thay đổi tên cục bộ theo mặc định

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

Nói cách khác, tất cả các tên được gán bên trong 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
3 của hàm là cục bộ theo mặc định; . Độ 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ục [G], rồi đến tích hợp sẵn [B]—và dừng lại ở vị trí đầ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ỉ tham chiếu đế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 khai báo là toàn cầu trong hàm đó

  • Khi bên ngoài một chức năng [i. e. , ở cấp cao nhất của mô-đun hoặc tại dấu nhắc tương tác], phạm vi cục bộ giống với phạm vi toàn cầu—không gian tên của mô-đun

hinh 4. 1 minh họa ba phạm vi của Python. Để 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
4]. Trong hai chương tiếp theo, chúng ta sẽ thấy rằng các quy tắc dành cho 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
5, được gọi là thuộc tính] tồn tại trong một đối tượng cụ thể và do đó hoạt động khác nhau

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

Hãy xem một ví dụ thể hiện ý tưởng phạm vi. Giả sử chúng ta viết đoạn mã sau vào 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 chứa trong đó, sử dụng một số tên để thực hiện công việc kinh doanh của họ. Sử dụng quy tắc phạm vi của 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
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
7

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ì nó được chỉ định ở cấp cao nhất của tệp mô-đun; .
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
7 là toàn cầu vì lý do tương tự;

tên địa phương.
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,
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

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 và
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 là cục bộ của hàm [và chỉ tồn tại khi hàm chạy], vì cả hai đều được gán một giá trị trong định nghĩa hàm;

Toàn bộ điểm đằng sau lược đồ phân tách 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 khi một hàm đang chạy. Chẳng hạn, đối số

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 và kết quả cộng
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 chỉ tồn tại bên trong hàm; . Sự phân biệt cục bộ/toàn cầu cũng làm cho một chức năng dễ hiểu hơn; . []

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à thứ duy nhất giống như một tuyên bố trong Python. Nó báo cho Python biết rằng một hàm có kế hoạch thay đổi tên toàn cục—những tên nằm trong phạm vi [không gian tên] của mô-đun kèm theo. Chúng ta đã nói về
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 rồi;

  • 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 có nghĩa là “tên ở cấp cao nhất của 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 hàm mà không được khai báo

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 chỉ là từ khóa
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, 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ạ tới phạm vi của mô-đun kèm theo khi được gán hoặc tham chiếu trong 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,

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
17,
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
18 và
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
19 đều là các toàn cục bên trong hàm
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
20.
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
18 và
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
19 là toàn cục vì chúng không được gán trong hàm; . chúng tôi đã liệt kê 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 để ánh xạ nó vào phạm vi của mô-đun một cách rõ ràng. Nếu không có
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 ở đây, thì
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
17 sẽ được coi là địa phương nhờ nhiệm vụ. Lưu ý rằng
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
18 và
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
19 không được khai báo toàn cầu; . Cũng lưu ý rằng
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
17 có thể không tồn tại trong mô-đun kèm theo trước khi chức năng chạy;

Có bao nhiêu loại 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ụ. cục bộ, kèm theo, 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 trình thông dịch Python sử dụng khi làm việc với các biến.

Phạm vi cục bộ và toàn cầu trong Python là gì?

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ầu [bên ngoài hàm] và . ]:

Phạm vi của các biến cục bộ và toàn cầu là gì?

Phạm vi là một vùng của chương trình và nói chung có ba vị trí, nơi các biến có thể được khai báo. Bên trong một hàm hoặc một khối được gọi là biến cục bộ, Trong định nghĩa về tham số hàm được gọi là tham số hình thức. Bên ngoài tất cả các hàm được gọi là biến toàn cục

Chủ Đề