Tính vế phải rồi gắn với tên bên trái
Trong `so = 5`, `so` là **tên biến**, còn `5` là **giá trị** tại thời điểm ấy. Với `so = so + 3`, Python lấy giá trị hiện có của `so` là 5, cộng 3 được 8, rồi gán lại cho `so`. Dấu `=` trong mã là **lệnh gán**, không phát biểu rằng hai biểu thức bằng nhau trong mọi thời điểm.
Biến cần có giá trị trước khi dùng ở vế phải. Nếu chạy `tong = gia + 2` mà chưa gán `gia`, Python báo `NameError`. Kiểu của giá trị gắn với cùng tên có thể đổi ở lần gán sau; chẳng hạn `x = 5` rồi `x = "năm"`, lúc cuối `x` là xâu.
Bài luyện
Sau `so = 5` rồi `so = so + 3`, giá trị cuối của `so` là bao nhiêu?
3 chỉ là số cộng thêm.
5 là giá trị trước lệnh thứ hai.
Vế phải lấy 5 + 3 = 8 rồi gán lại.
Biến đã có giá trị trước khi dùng.
Lời giải
Lệnh thứ hai tính vế phải bằng giá trị cũ: `5 + 3 = 8`, rồi gán 8 cho `so`.
Bài luyện
Chạy riêng dòng `tong = gia + 2` khi `gia` chưa từng được gán sẽ thế nào?
Không thể tính vế phải khi thiếu giá trị.
Tên ở vế phải phải có giá trị trước khi tính.
Python không tự gán 0 cho tên chưa có.
Vế phải là biểu thức, không ở trong nháy.
Lời giải
Python tính vế phải trước. `gia` chưa được gán nên không có giá trị để cộng 2; chương trình báo `NameError`.
Gán đồng thời dùng giá trị cũ
Lệnh `a, b = 2, 7` gán hai giá trị cho hai tên. Sau `a, b = b, a`, Python lấy **cả hai giá trị cũ** của vế phải rồi gán đồng thời: `a` thành 7 và `b` thành 2. Điều này khác hai lệnh liên tiếp `a = b` rồi `b = a`: sau dòng đầu cả `a` và `b` đều bằng 7, nên dòng sau không lấy lại được 2.
Nhiệm vụ: tạo `doi-cho.py` gồm ba dòng dưới đây, chạy và kiểm màn hình in `7 2`. Nếu ra `7 7`, kiểm có viết thành hai lệnh gán liên tiếp hay không.
```python
a, b = 2, 7
a, b = b, a
print(a, b)
```
Bài luyện
Bắt đầu với `a = 2`, `b = 7`. Sau `a, b = b, a`, cặp `(a, b)` là gì?
Lệnh đã đổi giá trị của hai tên.
Đây là kết quả khi gán tuần tự sai cách.
Không có bước nào gán cả hai bằng 2.
Vế phải lấy cặp cũ (7, 2) rồi gán vào a, b.
Lời giải
Trước lệnh, `(a, b) = (2, 7)`. Vế phải `b, a` cho `(7, 2)` từ giá trị cũ; gán lại được `(a, b) = (7, 2)`.
Đang học