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 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 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 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
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 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;
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 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;