Bản tóm tắt. trong hướng dẫn này, bạn sẽ tìm hiểu cách phạm vi biến Python hoạt động. Sau hướng dẫn, bạn sẽ hiểu rõ về phạm vi tích hợp, cục bộ và toàn cầu
Giới thiệu về phạm vi biến Python
Khi bạn gán một đối tượng cho một biến, biến sẽ tham chiếu đối tượng đó trong bộ nhớ. Và nó nói rằng biến được liên kết với đối tượng
Sau khi gán, bạn có thể truy cập đối tượng bằng cách sử dụng tên biến trong các phần khác nhau của mã của bạn. Tuy nhiên, bạn không thể truy cập biến ở mọi nơi trong mã
Tên biến và ràng buộc của nó [tên và đối tượng] chỉ tồn tại trong các phần cụ thể của mã của bạn
Phần mã nơi bạn xác định tên/liên kết được gọi là phạm vi từ vựng của các biến
Python lưu trữ các ràng buộc này trong một thứ gọi là không gian tên. Mỗi phạm vi có không gian tên riêng của mình
Và bạn có thể nghĩ rằng một không gian tên là một bảng chứa nhãn và tham chiếu mà nhãn được gắn vào
phạm vi toàn cầu
Phạm vi toàn cầu về cơ bản là phạm vi mô-đun. Phạm vi toàn cầu chỉ bao gồm một tệp mã nguồn Python duy nhất
Python không có phạm vi toàn cầu thực sự trải rộng trên tất cả các mô-đun ngoại trừ phạm vi tích hợp sẵn
Phạm vi tích hợp là một phạm vi đặc biệt cung cấp các đối tượng có sẵn trên toàn cầu như
2,Code language: Python [python]
print[counter]
3,Code language: Python [python]
print[counter]
4,Code language: Python [python]
print[counter]
5 vàCode language: Python [python]
print[counter]
6Code language: Python [python]
print[counter]
Về cơ bản, các biến tích hợp và toàn cục tồn tại ở mọi nơi bên trong một mô-đun
Trong nội bộ, phạm vi toàn cầu được lồng vào bên trong phạm vi tích hợp
Nếu bạn truy cập một biến từ một phạm vi và Python không tìm thấy nó trong không gian tên của phạm vi đó, thì nó sẽ tìm kiếm trong không gian tên của phạm vi kèm theo
Giả sử rằng bạn có câu lệnh sau trong một mô-đun có tên là
7Code language: Python [python]
print[counter]
Code language: Python [python]
print['Hello']
Trong mô-đun
7 này, Python tìm kiếm hàmCode language: Python [python]
print[counter]
2 trong phạm vi mô-đun [Code language: Python [python]
print[counter]
7]Code language: Python [python]
print[counter]
Vì Python không tìm thấy định nghĩa của hàm
2 trong phạm vi mô-đunCode language: Python [python]
print[counter]
7, nên Python đi đến phạm vi kèm theo, là phạm vi tích hợp sẵn và tìm hàm
print[counter]
Code language: Python [python]
2 ở đó. Trong trường hợp này, nó có thể tìm thấy hàmCode language: Python [python]
print[counter]
2 trong phạm vi tích hợpCode language: Python [python]
print[counter]
Nếu bạn thay đổi câu lệnh thành câu lệnh sau, bạn sẽ gặp lỗi thời gian chạy
Code language: Python [python]
print[counter]
Trong ví dụ này, Python không tìm thấy
55 trong phạm vi toàn cầu hiện tại. Do đó, Python tìm kiếm nó trong phạm vi kèm theo, là phạm vi tích hợp sẵnCode language: Python [python]
print[counter]
Tuy nhiên, biến
55 không tồn tại trong phạm vi tích hợp. Do đó, Python đưa ra một ngoại lệCode language: Python [python]
print[counter]
57Code language: Python [python]
print[counter]
5Code language: Python [python]
print[counter]
phạm vi cục bộ
Khi tạo một hàm, bạn có thể xác định các tham số và biến cho hàm. Ví dụ
9Code language: Python [python]
print[counter]
Khi bạn thực thi mã, Python mang hai giai đoạn. biên soạn và thực hiện
Khi Python biên dịch tệp, nó sẽ thêm hàm
58 vào phạm vi toàn cầu. Ngoài ra, Python xác định rằng các biếnCode language: Python [python]
print[counter]
55,Code language: Python [python]
print[counter]
90 vàCode language: Python [python]
print[counter]
91 bên trong hàmCode language: Python [python]
print[counter]
92 sẽ là cục bộ của hàmCode language: Python [python]
print[counter]
92. Và Python sẽ không tạo các biếnCode language: Python [python]
print[counter]
55,Code language: Python [python]
print[counter]
90 vàCode language: Python [python]
print[counter]
91 cho đến khi hàm được thực thiCode language: Python [python]
print[counter]
Mỗi khi bạn gọi một hàm, Python sẽ tạo một phạm vi mới. Python cũng gán các biến được xác định bên trong hàm cho phạm vi đó. Và phạm vi này được gọi là phạm vi chức năng cục bộ hoặc phạm vi cục bộ
Trong ví dụ của chúng ta, khi bạn gọi hàm
92Code language: Python [python]
print[counter]
0Code language: Python [python]
print[counter]
… Python tạo phạm vi cục bộ cho lệnh gọi hàm
92Code language: Python [python]
print[counter]
Ngoài ra, Python tạo các biến cục bộ
55,Code language: Python [python]
print[counter]
90 vàCode language: Python [python]
print[counter]
91 trong không gian tên cục bộ và liên kết chúng với các giá trịCode language: Python [python]
print[counter]
02,Code language: Python [python]
print[counter]
03 vàCode language: Python [python]
print[counter]
04Code language: Python [python]
print[counter]
Khi chức năng hoàn thành, Python sẽ xóa phạm vi cục bộ. Và tất cả các biến cục bộ như biến
55,Code language: Python [python]
print[counter]
90 vàCode language: Python [python]
print[counter]
91 đều nằm ngoài phạm vi. Nếu bạn cố gắng truy cập các biến này từ bên ngoài hàmCode language: Python [python]
print[counter]
92, bạn sẽ gặp lỗiCode language: Python [python]
print[counter]
Và nếu bạn gọi lại hàm
92Code language: Python [python]
print[counter]
3Code language: Python [python]
print[counter]
… Python tạo một phạm vi cục bộ mới và các biến bao gồm
55,Code language: Python [python]
print[counter]
90 vàCode language: Python [python]
print[counter]
91, đồng thời liên kết chúng với các giá trịCode language: Python [python]
print[counter]
33,Code language: Python [python]
print[counter]
34 vàCode language: Python [python]
print[counter]
35Code language: Python [python]
print[counter]
tra cứu biến
Trong Python, phạm vi được lồng vào nhau. Ví dụ: phạm vi cục bộ được lồng trong phạm vi mô-đun. Và phạm vi mô-đun được lồng bên trong phạm vi tích hợp
Khi bạn truy cập một đối tượng được liên kết với một biến, Python sẽ cố gắng tìm đối tượng
- trong phạm vi địa phương hiện tại đầu tiên
- và đi lên chuỗi phạm vi kèm theo nếu Python không tìm thấy đối tượng trong phạm vi hiện tại
Từ khóa toàn cầu
Khi bạn truy xuất giá trị của một biến toàn cục từ bên trong một hàm, Python sẽ tự động tìm kiếm không gian tên của phạm vi cục bộ và lên chuỗi của tất cả các không gian tên phạm vi kèm theo. Ví dụ
0Code language: Python [python]
print[counter]
Trong ví dụ này, khi hàm
36 đang chạy, Python sẽ tìm biếnCode language: Python [python]
print[counter]
55 trong phạm vi cục bộCode language: Python [python]
print[counter]
Vì Python không tìm thấy nó, nên nó tìm kiếm biến trong phạm vi toàn cầu. Và Python có thể tìm thấy biến
55 trong phạm vi toàn cầu trong trường hợp nàyCode language: Python [python]
print[counter]
Tuy nhiên, nếu bạn gán một giá trị cho một biến toàn cục từ bên trong một hàm, thay vào đó Python sẽ đặt biến đó vào không gian tên cục bộ. Ví dụ
4Code language: Python [python]
print[counter]
đầu ra
5Code language: Python [python]
print[counter]
Tại thời điểm biên dịch, Python hiểu
55 là một biến cục bộCode language: Python [python]
print[counter]
Khi chức năng
00 đang chạy, Python tìm thấyCode language: Python [python]
print[counter]
55 trong phạm vi cục bộ. Câu lệnhCode language: Python [python]
print[counter]
02 bên trong hàmCode language: Python [python]
print[counter]
00 hiển thị giá trị củaCode language: Python [python]
print[counter]
55, bằng 0Code language: Python [python]
print[counter]
Khi chúng tôi in
55 sau khi chức năngCode language: Python [python]
print[counter]
00 hoàn thành, thay vào đó, nó hiển thị 10Code language: Python [python]
print[counter]
Trong ví dụ này, biến
55 cục bộ che dấu biếnCode language: Python [python]
print[counter]
55 toàn cầuCode language: Python [python]
print[counter]
Nếu bạn muốn truy cập một biến toàn cục từ bên trong một hàm, bạn có thể sử dụng từ khóa
09. Ví dụCode language: Python [python]
print[counter]