Bài 32. Biến sống ở đâu: cục bộ, toàn cục và lệnh global
Cùng một cái tên biến, nhưng đặt trong hàm hay ngoài hàm lại cho ra hai kết quả khác hẳn nhau. Bài này giúp bạn phân biệt biến cục bộ với biến toàn cục, hiểu vì sao gán giá trị trong hàm thường không làm đổi biến bên ngoài, và khi nào thì cần đến lệnh global.
- Kết nối tri thứcTin học 10 - Bài 28. Phạm vi của biếntr. 136–140
Bắt đầu bằng một hình dung
Lớp 10A đang chuẩn bị cho hội trại cuối năm. Cuối lớp có một tấm bảng phụ, trên đó lớp trưởng ghi to một dòng duy nhất: "Quỹ hội trại: 500 nghìn". Ai đi ngang cũng đọc được con số ấy, và cả lớp đều lấy nó làm căn cứ khi bàn bạc.
Hôm sau, tổ 1 họp riêng để tính chuyện mua nước và bánh. Bạn tổ trưởng lấy cuốn sổ nháp của tổ mình ra, viết vào đó: "Quỹ hội trại: 300 nghìn" - vì tổ chỉ được giao quản một phần tiền. Họp xong, cả tổ giải tán, cuốn sổ nháp được gấp lại cất vào cặp. Điều thú vị là: dòng chữ trên tấm bảng phụ cuối lớp vẫn nguyên vẹn "500 nghìn", chẳng suy suyển gì.
Tổ 2 họp sau đó cũng làm y hệt: mở sổ nháp riêng của tổ mình, cũng viết một dòng tên y chang "Quỹ hội trại", nhưng ghi con số khác. Hai cuốn sổ nháp nằm trong hai cái cặp khác nhau, chẳng cuốn nào đè lên cuốn nào, và cũng chẳng cuốn nào chạm được tới tấm bảng chung.
Muốn con số trên tấm bảng phụ thật sự thay đổi, phải có người cầm bút, đi tới tận nơi, xoá số cũ và viết số mới lên bảng - một hành động rõ ràng, ai cũng nhìn thấy. Chuyện tưởng như vụn vặt này lại chính là quy tắc mà Python dùng để quản lí các cái tên trong chương trình, và nếu không nắm được nó, bạn sẽ đoán sai kết quả của rất nhiều đoạn chương trình có hàm.
Nội dung bài học
- 1) Biến sinh ra bên trong hàm chỉ sống khi hàm đang chạy
- 2) Biến toàn cục: hàm đọc được, nhưng gán vào lại là chuyện khác
- 3) Lệnh global - mở khoá để hàm sửa được biến toàn cục
Tóm tắt lý thuyết cần nhớ
- Biến cục bộ là biến tạo ra bên trong thân hàm, kể cả các tham số: nó chỉ tồn tại trong lúc hàm chạy và gọi tên nó từ ngoài hàm sẽ gây lỗi
NameError. - Biến toàn cục khai báo ở ngoài mọi hàm; hàm đọc được giá trị của nó, nhưng chỉ cần trong hàm có một lệnh gán cho tên đó là Python lập tức tạo ra một biến cục bộ mới tách rời hẳn.
- Gán cho tên trùng biến toàn cục ở trong hàm không làm thay đổi biến toàn cục - chạy xong hàm, giá trị bên ngoài vẫn nguyên như cũ.
- Lệnh
global ten_bienđặt ở đầu thân hàm cho phép hàm sửa thật biến toàn cục, nhưng nên hạn chế dùng và thay bằng cách truyền tham số vào rồi lấy kết quả quareturn.
Thuật ngữ tiếng Anh trong bài
| Tiếng Anh | Đọc là | Nghĩa |
|---|---|---|
| variable | VE-ri-ơ-bồ | biến Một cái hộp có tên, dùng để chứa một giá trị. |
| function | PHẮNG-sần | hàm Một 'cỗ máy nhỏ' lắp sẵn để làm một việc cụ thể. |
Câu hỏi trắc nghiệm có đáp án
Mấy câu mẫu để bạn tự kiểm tra ngay. Trong ứng dụng, bài này có đủ 25 câu, chấm điểm tự động và giải thích từng câu sai.
- Từ lúc chương trình bắt đầu cho đến khi chương trình kết thúc.
- Chỉ trong lúc hàm đang chạy; hàm kết thúc thì biến đó cũng mất.
- Chỉ tồn tại nếu hàm có lệnh return, còn không thì bị bỏ qua.
- Tồn tại cho đến khi có một hàm khác gán lại giá trị cho tên đó.
print với tên một biến chỉ được tạo ra bên trong thân hàm đó. Điều gì xảy ra?- Chương trình báo lỗi
NameErrorvì ở ngoài hàm không có cái tên đó. - Chương trình in ra giá trị cuối cùng mà biến đó nhận được trong hàm.
- Chương trình in ra 0, vì biến đã bị xoá nên tự trở về giá trị mặc định.
- Chương trình in ra
None, giống như khi gọi một hàm không có return.
diem = 8
def sua_diem():
diem = 10
sua_diem()
print(diem)
- 10
- 18
- Báo lỗi vì trong hàm không được đặt tên biến trùng với biến ở ngoài.
- 8
- a)Tham số của hàm cũng là một biến cục bộ, chỉ tồn tại trong lúc hàm đang chạy.Đúng
- b)Một hàm không thể đọc được giá trị của biến toàn cục nếu không khai báo
global.Sai - c)Nếu trong thân hàm có lệnh gán cho một tên trùng biến toàn cục mà không khai báo
global, thì sau khi hàm chạy xong giá trị của biến toàn cục vẫn giữ nguyên.Đúng - d)Hai hàm khác nhau không được đặt trùng tên biến cục bộ, vì như vậy chúng sẽ ghi đè giá trị của nhau.Sai
- (a) Đúng - tham số được tạo ra khi hàm nhận đối số và bị xoá cùng các biến cục bộ khác lúc hàm kết thúc, nên gọi tên tham số ở ngoài hàm sẽ gây lỗi NameError.
- (b) Sai - hàm luôn đọc được biến toàn cục mà không cần khai báo gì; global chỉ cần khi hàm muốn GÁN giá trị mới cho biến toàn cục đó.
- (c) Đúng - lúc này Python coi tên đó là biến cục bộ mới của riêng hàm, biến toàn cục cùng tên không hề bị chạm tới nên giá trị bên ngoài không đổi.
- (d) Sai - mỗi lần gọi hàm có khu làm việc riêng, nên hai hàm dùng trùng tên biến cục bộ vẫn hoạt động độc lập; chính nhờ vậy mà các hàm viết riêng lẻ có thể ghép chung vào một chương trình mà vẫn chạy đúng.
Thử ngay: minh hoạ từng bước
Bấm từng bước để tự xem cơ chế hoạt động, hoặc bấm “Tự chạy” cho nó tiến mỗi giây một lần. Đổi được dữ liệu đầu vào - không cần đăng nhập.
Học trọn bài này trong ứng dụng
Bài giảng đầy đủ, 25 câu luyện tập chấm tự động, thi thử đúng cấu trúc đề tốt nghiệp (24 trắc nghiệm + 4 Đúng/Sai), bài thực hành máy tự chấm và gia sư AI giải thích chỗ sai.
Phần học miễn phí, không cần tạo tài khoản.
Bài liên quan - Lập trình, Thuật toán & CTDL (KHMT)
Cùng mạch kiến thức với bài này, học nối tiếp cho chắc phần lí thuyết.