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. Show Đâ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 rule1). [] 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ớiMỗ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ầuTheo 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 rule2 bên trong hàmTấ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 LGBNế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
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 rule3 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
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 rule4). 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 rule5, đượ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 rule6, 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 rule7 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 rule6 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 rule7 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 rule3, 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 rule4 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 rule3 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 rule4 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 rule3 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 rule4 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 rule2 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 rule2 rồi;
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 rule2 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 rule2, 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 rule17, 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 rule18 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 rule19 đề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 rule20. 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 rule18 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 rule19 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 rule2 để á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 rule2 ở đâ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 rule17 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 rule18 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 rule19 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 rule17 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 |