Một biến có thể giữ nhiều giá trị
Danh sách (`list`) đặt các phần tử trong ngoặc vuông, ví dụ `mau = ["đỏ", "xanh", "vàng"]`. `len(mau)` bằng 3. Phần tử đầu có chỉ số **0**, nên `mau[0]` là `"đỏ"`, `mau[2]` là `"vàng"`. `mau[3]` gây `IndexError` vì chỉ số hợp lệ theo chiều từ đầu chỉ là 0, 1, 2.
Python cho phép list chứa các kiểu giá trị khác nhau, nhưng ví dụ bài học dùng một loại dữ liệu trong mỗi danh sách để dễ theo dõi. `[]` tạo list rỗng, `len([])` bằng 0; không thể đọc phần tử số 0 của list rỗng.
Bài luyện
Với `mau = ["đỏ", "xanh", "vàng"]`, giá trị `mau[1]` là gì?
"đỏ" ở chỉ số 0.
Chỉ số 1 là phần tử thứ hai.
"vàng" ở chỉ số 2.
List đánh số từ 0.
Lời giải
Các chỉ số lần lượt 0, 1, 2 ứng với đỏ, xanh, vàng. Vì vậy `mau[1]` là `"xanh"`.
Bài luyện
Với danh sách trên, biểu thức nào gây IndexError?
Chỉ số 0 có phần tử.
Chỉ số 1 có phần tử.
Chỉ số 2 có phần tử.
Danh sách dài 3 nên chỉ có chỉ số 0 đến 2.
Lời giải
`len(mau) = 3`, nên chỉ số hợp lệ theo chiều từ đầu là 0, 1, 2. Chỉ số 3 vượt phạm vi và báo `IndexError`.
Sửa, xóa và ghép là việc khác nhau
`mau[1] = "lam"` thay giá trị tại chỉ số 1. `del mau[0]` xóa phần tử đầu, các phần tử còn lại dồn trái. `mau + ["tím"]` tạo **danh sách mới** có thêm phần tử ở cuối; nếu chỉ viết biểu thức đó mà không gán lại, `mau` cũ không đổi. Cần nhìn trạng thái sau từng lệnh, nhất là sau khi xóa vì chỉ số sẽ dịch chuyển.
```python
mau = ["đỏ", "xanh", "vàng"]
mau[1] = "lam"
del mau[0]
print(mau)
```
Kết quả là `['lam', 'vàng']`.
Bài luyện
Sau mã sửa và xóa trong bài, danh sách `mau` còn gì?
Đỏ đã bị xóa.
Xanh được thay bằng lam, sau đó đỏ bị xóa.
Lam vẫn còn.
Xanh đã được thay bằng lam.
Lời giải
Bắt đầu đỏ, xanh, vàng; gán chỉ số 1 thành lam được đỏ, lam, vàng; xóa chỉ số 0 còn lam, vàng.
Đang học