Tổng kết module — bạn đã có cỗ máy trong đầu
Nhìn lại bốn thứ vừa dựng: máy làm đúng từng chữ, biến là ô nhớ có tên, ô nhớ có kiểu, và bảng trace để tự chạy chương trình. Tự chấm trước khi đi tiếp.
TL;DR: Năm bài vừa qua dựng đúng một cỗ máy trong đầu bạn, từng mảnh một: máy chạy đúng từng dòng lệnh theo thứ tự viết, không suy diễn ý người viết; biến là một ô nhớ có tên, dấu bằng chép giá trị vào ô đó sau khi vế phải đã tính xong, ghi đè giá trị cũ; ô nhớ còn giữ thêm một kiểu, nên cộng chuỗi với số dừng chương trình bằng TypeError chứ không tự đoán; và bảng trace là công cụ để bạn tự đóng vai máy, đi từng dòng một, ghi lại giá trị mọi biến. Bài này không dạy gì mới. Nó chỉ gom bốn mảnh đó lại một chỗ, để bạn tự chấm xem mảnh nào còn lỏng trước khi mang cả cỗ máy sang module sau.
1. Đã đi qua những gì
Xuất phát điểm của cả module là một sự thật khó chịu: máy không thông minh theo kiểu bạn quen với con người. Bài 01 cho bạn thấy máy giống người bị bịt mắt pha mì hơn là một trợ lý biết đoán ý — nó chỉ có đúng một dòng lệnh trước mặt tại một thời điểm, làm xong mới chuyển sang dòng kế tiếp, và tuyệt đối không tự sắp xếp lại thứ tự dù thứ tự đó vô lý tới đâu. Nghe hiển nhiên, nhưng đây là tiên đề mọi bài sau đều dựa vào, kể cả bảng trace ở bài 04.
Từ tiên đề đó, bài 02 đặt viên gạch thứ hai: biến là một cái tên gắn cố định với một ô nhớ, giống tủ ký gửi dán nhãn ở siêu thị. Dấu bằng không phải phép so sánh hai vế bằng nhau — nó là một lệnh chạy theo đúng một chiều: tính xong toàn bộ vế phải trước, rồi mới chép kết quả vào ô bên trái, đè lên giá trị cũ. Cơ chế "tính trước, gán sau" đó là lý do x = x + 1 chạy được dù nhìn như một phương trình vô nghiệm.
Bài 03 thêm một chi tiết mà hai bài đầu chưa nhắc tới: ô nhớ không chỉ giữ giá trị, nó còn giữ một kiểu. "5" và 5 viết ra giống hệt nhau trên màn hình nhưng là hai ô khác loại, và Python thà dừng chương trình bằng traceback còn hơn đoán bừa khi bạn đem + giữa hai kiểu không khớp. Đây cũng là chỗ bạn đọc traceback thật đầu tiên trong khoá — kỹ năng sẽ còn dùng lại rất nhiều lần sau này.
Ba mảnh ghép đó gặp nhau ở bài 04: bảng trace là công cụ để bạn tự chạy tay một đoạn code nhiều dòng, cột là biến, hàng là dòng lệnh, mỗi ô ghi đúng giá trị NGAY SAU khi dòng đó chạy xong — không phải đọc lướt rồi đoán. Rồi bài 05 đem cả mô hình ra thử lửa: hoán đổi hai biến x, y bằng đúng hai dòng gán trực tiếp không ra kết quả bạn tưởng, vì x = y ghi đè x trước khi giá trị cũ của nó kịp dùng ở dòng sau. Cần một ô nhớ thứ ba (temp) để giữ giá trị cũ lại trước khi bị ghi đè. Bug đó không nằm ở "không biết thuật toán hoán đổi"; nó nằm đúng ở cơ chế ghi đè bạn học từ bài 02, và bảng trace ở bài 04 là công cụ duy nhất bắt được nó chắc chắn.
2. 🗺️ Cheat sheet — bốn khái niệm nền

| Khái niệm | Cốt lõi | Bẫy hay gặp |
|---|---|---|
| Máy thi hành từng lệnh | Chạy đúng từng dòng theo thứ tự viết, không suy diễn ý định, không tự sửa | Tưởng máy tự "hiểu" phần bạn quên viết, hoặc tự gộp hai lệnh giống nhau |
| Biến và phép gán | Biến là ô nhớ có tên; = tính xong vế phải rồi mới chép vào ô, ghi đè giá trị cũ | Coi = là phép so sánh; tưởng ô nhớ giữ được cả giá trị cũ lẫn giá trị mới sau khi gán lại |
| Ô nhớ có kiểu | Mỗi ô giữ một giá trị VÀ một kiểu; "5" (chuỗi) khác 5 (số) dù viết giống nhau | Cộng thẳng kết quả input() với một số mà quên nó vẫn còn là chuỗi — dừng bằng TypeError |
| Bảng trace | Cột là biến, hàng là dòng lệnh; mỗi ô ghi giá trị NGAY SAU khi dòng đó chạy xong | Coi ô "–" (chưa gán) là 0; quên cập nhật một biến vừa bị ghi đè |
✅ Self-assessment
Tick được cả bốn ý dưới thì bạn đã sẵn sàng qua module tiếp theo. Ô nào còn ngập ngừng, đọc lại đúng bài được gợi ý ngay dưới nó rồi quay lại tick.
- Tôi giải thích được vì sao máy thi hành đúng từng chữ theo thứ tự từng dòng, và không suy diễn ý định của người viết.
- Nếu chưa chắc: đọc lại bài 01 mục 3 và 5.
- Tôi giải thích được phép gán bằng mô hình ô nhớ có tên: vế phải được tính xong trước, giá trị được chép vào ô, và mỗi ô chỉ giữ một giá trị tại một thời điểm.
- Nếu chưa chắc: đọc lại bài 02 mục 2 và 3.
- Tôi dự đoán được kết quả khi cộng chuỗi với số, và đọc được dòng cuối traceback để biết hai kiểu vừa va nhau là gì.
- Nếu chưa chắc: đọc lại bài 03 mục 2 và 4.
- Tôi tự trace được một đoạn tám dòng tuần tự bằng bảng trace, điền đúng giá trị mọi biến sau từng dòng — kể cả khi một phép gán ghi đè làm mất dữ liệu.
Bốn câu dưới đây kiểm lại đúng bốn ý trên — trả lời trước khi xem gợi ý, giống cách bạn đã làm ở mọi bài Predict trong module.
- Q1Một người bạn không lập trình hỏi bạn: "sao máy không tự nhận ra tao viết sai thứ tự hai dòng lệnh, rồi tự sửa lại cho đúng?". Trả lời bằng đúng lời của bạn, không chép lại định nghĩa trong bài.
- Q2Đoạn
x = 10rồix = x + xchạy xong, ôxgiữ giá trị nào? Giải thích bằng đúng ba bước máy làm khi gán, không chỉ nêu con số. - Q3Đoạn sau có chạy được không?
nam = input('Nam sinh: ')rồituoi = 2026 - nam. Nếu không, vì sao, và sửa một chữ ở đâu? - Q4Nếu bạn gán a = b rồi b = a mà không dùng biến tạm, chuyện gì xảy ra với giá trị GỐC của a? Dùng cơ chế bảng trace để chứng minh, không chỉ đoán.
3. 🚀 Sắp tới
Cỗ máy bạn vừa dựng, chạy từng dòng, giữ trạng thái trong ô nhớ có kiểu, và bảng trace để tự kiểm, mới xử lý được chương trình chạy thẳng một mạch từ trên xuống dưới. Module tiếp theo của khoá sẽ dạy máy tự rẽ nhánh và tự lặp lại, để một chương trình không còn phải viết dài ra từng dòng cho mỗi trường hợp. Module đó chưa xuất bản — khi có, bạn sẽ thấy nó nối thẳng vào đúng bảng trace bạn vừa luyện ở đây, chỉ thêm một cột mới: cột ghi mũi tên đi tới dòng nào tiếp theo.
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên