Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Phạm vi biến trong Python
Hiểu về phạm vi biến là một yếu tố quan trọng để quản lý và sử dụng các biến một cách hiệu quả. Bằng cách nắm rõ các phạm vi biến, bạn có thể kiểm soát cách các biến được tạo, truy cập và thay đổi trong suốt chương trình. Hướng dẫn này sẽ giúp bạn làm quen với khái niệm về phạm vi biến trong Python, bao gồm phạm vi tích hợp, phạm vi toàn cục và phạm vi cục bộ. Sau khi nắm vững các kiến thức này, bạn sẽ có nền tảng vững chắc để viết mã Python rõ ràng, hiệu quả và không gặp phải các lỗi liên quan đến phạm vi biến.
Giới thiệu về phạm vi biến trong Python
Khi bạn gán một đối tượng cho một biến, biến đó sẽ tham chiếu đến đối tượng đó trong bộ nhớ. Điều này có nghĩa là 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 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ã của bạn.
Tên biến và sự liên kết 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.
Bài viết này được đăng tại [free tuts .net]
Phần của mã mà bạn xác định sự liên kết tên/biến được gọi là phạm vi từ vựng của các biến.
Python lưu các sự liên kết này trong cái gọi là không gian tên. Mỗi phạm vi có không gian tên riêng của nó.
Bạn có thể coi một không gian tên như một bảng chứa nhãn và tham chiếu mà nhãn đó được liên kết với.
Phạm vi toàn cục
Phạm vi toàn cục cơ bản là phạm vi của mô-đun. Phạm vi toàn cục chỉ bao phủ một tệp mã nguồn Python duy nhất.
Python không có một phạm vi toàn cục thực sự bao phủ tất cả các mô-đun ngoại trừ phạm vi tích hợp.
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 toàn cục như print, len, None, True và False.
Cơ bản, các biến tích hợp và toàn cục tồn tại ở mọi nơi trong một mô-đun.
Nội bộ, các phạm vi toàn cục được lồng trong phạm vi tích hợp:
Phạm vi cục bộ
Khi tạo một hàm, bạn có thể định nghĩa các tham số và biến cho hàm đó. Ví dụ:
def tăng(counter, bởi=1): kết_quả = counter + bởi return kết_quả
Khi bạn thực thi mã, Python đi qua hai giai đoạn: biên dịch và thực thi.
Khi Python biên dịch tệp, nó thêm hàm tăng vào phạm vi toàn cục. Ngoài ra, Python xác định rằng các biến counter, bởi và kết_quả trong hàm tăng() sẽ chỉ thuộc về phạm vi cục bộ của hàm tăng(). Và Python sẽ không tạo ra các biến counter, bởi và kết_quả cho đến khi hàm được thực thi.
Mỗi khi bạn gọi một hàm, Python tạo ra một phạm vi mới. Python cũng gán các biến được xác định trong hàm đó cho phạm vi đó. Phạm vi này được gọi là phạm vi cục bộ của hàm hoặc phạm vi cục bộ.
Ví dụ của chúng tôi, khi bạn gọi hàm tăng():
tăng(10, 2)
Python tạo ra một phạm vi cục bộ cho cuộc gọi hàm tăng().
Ngoài ra, Python tạo ra các biến cục bộ counter, bởi và kết_quả trong không gian tên cục bộ và liên kết chúng với các giá trị 10, 2 và 12.
Khi hàm hoàn thành, Python sẽ xóa phạm vi cục bộ. Tất cả các biến cục bộ như counter, bởi và kết_quả sẽ không còn trong 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àm tăng(), bạn sẽ nhận được lỗi.
Và nếu bạn gọi hàm tăng() một lần nữa:
tăng(100, 3)
Python tạo ra một phạm vi cục bộ mới và các biến bao gồm counter, bởi và kết_quả, và liên kết chúng với các giá trị 100, 3 và 103.
Tìm kiếm biến
Trong Python, các phạm vi được lồng nhau. Ví dụ, các phạm vi cục bộ được lồng trong một phạm vi mô-đun. Và các phạm vi mô-đun được lồng 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 cố gắng tìm đối tượng đó:
- Trong phạm vi cục bộ hiện tại đầu tiên.
- Và lên dây chuyền các phạm vi bao quanh nếu Python không tìm thấy đối tượng trong phạm vi hiện tại.
Từ khóa global trong Python
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 tự động tìm kiếm không gian tên của phạm vi cục bộ và lên dây chuyền tất cả các không gian tên của phạm vi bao quanh.
Ví dụ:
counter = 10 def hiện_tại(): print(counter) hiện_tại()
Trong ví dụ này, khi hàm hiện_tại() được thực thi, Python tìm kiếm biến counter trong phạm vi cục bộ.
Vì Python không tìm thấy nó, nó tìm kiếm biến trong phạm vi toàn cục. Và trong trường hợp này, Python có thể tìm thấy biến counter trong phạm vi toàn cục.
Tuy nhiên, nếu bạn gán một giá trị cho biến toàn cục từ bên trong một hàm, Python sẽ đặt biến đó vào không gian tên cục bộ thay vì vị trí. Ví dụ:
counter = 10 def reset(): global counter counter = 0 print(counter) reset() print(counter)
Kết quả là:
0 0
Trong ví dụ này, câu lệnh sau:
global counter
...chỉ dẫn Python rằng biến counter được liên kết với phạm vi toàn cục, chứ không phải phạm vi cục bộ.
Lưu ý rằng không phải là một thực hành tốt để truy cập biến toàn cục bên trong một hàm.
Kết bài
Nắm vững các phạm vi của biến trong Python là yếu tố then chốt để viết mã hiệu quả và tránh những lỗi không mong muốn. Hiểu rõ về phạm vi tích hợp, phạm vi toàn cục và phạm vi cục bộ giúp bạn kiểm soát cách các biến được tạo ra, truy cập và thay đổi trong suốt chương trình. Python lưu trữ các đối tượng và sự liên kết của chúng trong không gian tên của từng phạm vi, và quá trình tìm kiếm một đối tượng sẽ bắt đầu từ phạm vi hiện tại rồi mới lên các phạm vi bao quanh. Việc biết cách sử dụng từ khóa global
cho phép bạn truy cập và thay đổi biến toàn cục từ bên trong một hàm khi cần thiết. Từ đây, bạn có thể tự tin viết mã Python với khả năng quản lý phạm vi biến một cách hiệu quả và chính xác.