Đường chéo chính
Ma trận đơn vị bậc 3 có ba hàng, ba cột. Ô hàng 0 cột 0, hàng 1 cột 1 và hàng 2 cột 2 bằng 1; các ô khác bằng 0. Có thể tạo bằng hai vòng lặp, mỗi lượt vòng ngoài tạo **một hàng mới**:
```python
def ma_tran_don_vi(n):
if n < 0:
raise ValueError("n phải không âm")
a = []
for i in range(n):
hang = []
for j in range(n):
hang.append(1 if i == j else 0)
a.append(hang)
return a
print(ma_tran_don_vi(3))
```
Kết quả là `[[1, 0, 0], [0, 1, 0], [0, 0, 1]]`. Khi n=0, kết quả là bảng rỗng `[]`; để có ma trận bậc dương cần nhập n≥1. Bài toán sách dùng n là số tự nhiên; đoạn kiểm trên nói rõ cách xử lí nếu nhận số âm.
Hai vị trí có thể trỏ tới cùng một hàng
Xét:
```python
hang = [0, 0]
a = [hang, hang]
a[0][0] = 1
print(a)
```
Kết quả là `[[1, 0], [1, 0]]`: `a[0]` và `a[1]` cùng trỏ tới một danh sách `hang`. Đây vẫn là dữ liệu hai tầng, nhưng sửa một “hàng” cũng đổi hàng kia. Muốn hai hàng độc lập, tạo riêng `[[0, 0], [0, 0]]` hoặc tạo mỗi hàng trong vòng lặp như ví dụ ma trận đơn vị.
Bài luyện
Trong ma trận đơn vị bậc 3, ô hàng chỉ số 1, cột chỉ số 1 có giá trị nào?
Chỉ số 0 không làm đổi quy tắc đường chéo.
Ô trên đường chéo chính bằng 1.
Giá trị ô không bằng tổng chỉ số.
Bậc ma trận không phải giá trị ô.
Lời giải
Ma trận đơn vị đặt 1 ở những ô có i=j; ô [1][1] nằm trên đường chéo chính.
Bài luyện
Sau `hang=[0,0]; a=[hang,hang]; a[0][0]=1`, giá trị của `a[1][0]` là gì?
Hai vị trí không tạo hai bản sao.
Sửa phần tử của đối tượng chung được nhìn thấy ở cả hai vị trí.
Số hàng không phải giá trị ô.
a[1] có tồn tại và chính là hang.
Lời giải
a[0] và a[1] cùng là đối tượng hang; đổi hang[0] thành 1 khiến a[1][0] cũng là 1.
Bài luyện
Cách nào tạo hai hàng `[0, 0]` độc lập để sửa hàng đầu không đổi hàng sau?
Hai mục dùng chung một hang.
Hai biểu thức list bên trong tạo hai đối tượng khác nhau.
Phép nhân list lặp lại tham chiếu đến cùng hang.
a tự chứa a, không tạo hai hàng số.
Lời giải
Trong `[[0,0],[0,0]]`, hai list con được tạo riêng. Sửa a[0][0] không tác động a[1][0].
Đang học