Biến và gán giá trị
Bạn sẽ học được
- Biến trong Python là tên gắn vào giá trị, không phải ô nhớ cố định.
- Kiểu động hoạt động thế nào và khi nào nó thành rủi ro.
- Gán nhiều biến, hoán đổi giá trị, gán nối tiếp.
- Quy ước đặt tên và hằng số.
- Vì sao
=không phải "bằng nhau".
Khái niệm cốt lõi
Câu lệnh gán trông rất đơn giản:
name = "An"
age = 28Đọc là: "gắn tên name vào giá trị "An"". Biến không phải cái hộp chứa giá trị; nó là nhãn dán lên một đối tượng trong bộ nhớ. Hiểu điều này sớm sẽ giúp bạn tránh nhiều lỗi ở chương list và dict.
Thí nghiệm:
x = 10
y = x
x = 20
print(x, y)20 10Dòng y = x gắn thêm nhãn y vào cùng giá trị 10. Khi x = 20, Python tạo giá trị mới 20 và gắn x vào đó; y vẫn trỏ đến 10. Không có chuyện y "đi theo" x.
Với đối tượng bất biến như số, chuỗi, tuple, hành vi này vô hại. Với đối tượng khả biến như list, nó tạo ra hiệu ứng phụ:
a = [1, 2]
b = a
b.append(3)
print(a, b)
print(a is b)[1, 2, 3] [1, 2, 3]
Truea và b cùng trỏ đến một list. Sửa qua b là sửa luôn a. Muốn bản sao độc lập, dùng b = a.copy() hoặc b = list(a). Chương list sẽ quay lại chi tiết.
Kiểu động
Cùng một biến có thể đổi kiểu:
value = 3.14
print(type(value))
value = "pi"
print(type(value), value)<class 'float'>
<class 'str'> piKhông cần khai báo float value. Python gắn nhãn vào giá trị mới, kiểu đi theo giá trị chứ không theo tên.
Điều này thuận tiện nhưng có giá: editor không biết value là gì cho đến khi chạy. Một lỗi như:
price = "890000"
quantity = 2
print(price * quantity)890000890000Chạy không lỗi, nhưng kết quả là chuỗi lặp lại, không phải phép nhân. Kiểu động không cứu bạn; chỉ có kiểm tra dữ liệu mới cứu. Từ Python 3.5+, type hint giúp editor và người đọc:
def total(price: float, quantity: int) -> float:
return price * quantityType hint không bắt buộc và không được kiểm tra lúc chạy, nhưng là tài liệu sống và giúp công cụ như mypy phát hiện lỗi trước.
Gán nhiều giá trị
Python hỗ trợ gán song song:
x, y = 1, 2
x, y = y, x
print(x, y)2 1Vế phải được đánh giá trước khi gán, nên hoán đổi không cần biến tạm. Đây là cách viết ưa dùng trong Python.
Gán nhiều tên cùng một giá trị:
a = b = c = 0Gán nối tiếp từ trái sang phải; cả ba tên cùng trỏ vào 0. Cẩn thận với đối tượng khả biến:
list_a = list_b = []
list_a.append(1)
print(list_b)[1]Nếu muốn ba list độc lập, viết riêng: a, b, c = [], [], [].
Còn có toán tử hải mã (walrus, Python 3.8+) cho phép gán trong biểu thức:
if (n := len("data")) > 3:
print(f"Độ dài {n}")Dùng tiết chế; nó hữu ích trong while và comprehension, nhưng làm câu lệnh khó đọc nếu lạm dụng.
Đặt tên
Quy ước PEP 8 — chuẩn định dạng chính thức của Python:
| Loại | Quy ước | Ví dụ |
|---|---|---|
| Biến, hàm | snake_case | total_price, tinh_diem |
| Hằng số | UPPER_CASE | MAX_RETRY, PI |
| Lớp | PascalCase | DataFrame, Customer |
| Module, gói | snake_case ngắn | pandas, doc_csv |
Tên hợp lệ bắt đầu bằng chữ cái hoặc _, theo sau là chữ, số, _. Không dùng từ khóa (if, for, class, None, True). Tên có dấu tiếng Việt chạy được nhưng nên tránh để dễ gõ và tương thích công cụ.
Tên nên nói ý nghĩa, không nói kiểu: price tốt hơn p, customer_count tốt hơn n2. Python không có giới hạn độ dài tên; đừng tiết kiệm ký tự.
Hằng số
Python không có hằng số thật. Quy ước viết hoa để báo "đừng sửa":
MAX_RETRY = 3
TAX_RATE = 0.08Không ai ngăn bạn gán lại MAX_RETRY = 5; đó là kỷ luật của nhóm. Với giá trị cần bảo vệ nghiêm ngặt, dùng enum hoặc dataclass bất biến (chương sau).
= không phải "bằng nhau"
Trong toán, x = 5 là một khẳng định. Trong Python, nó là lệnh gán. Phép so sánh bằng là ==:
x = 5 # gán
print(x == 5) # so sánh → True
print(x == 6) # → FalseLỗi kinh điển của người mới:
if x = 5:
...SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?Python 3.8+ còn gợi ý luôn cách sửa.
Thực hành
- Chạy thí nghiệm
x = 10; y = x; x = 20và giải thích kết quả bằng khái niệm "nhãn". - Tạo list
a, gánb = a, thêm phần tử quab, xema. Làm lại vớib = a.copy(). - Hoán đổi hai biến bằng một dòng, không dùng biến tạm.
- Đặt tên lại một đoạn code mẫu theo PEP 8.
- Viết
if x = 5và đọc gợi ý lỗi của Python. - Dùng
type()kiểm tra kiểu sau mỗi lần gán lại cùng một tên.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
NameError | Dùng trước khi gán hoặc gõ sai tên | Gán trước, kiểm tra chính tả |
| Hai biến đổi cùng lúc | Cùng trỏ một list/dict | .copy() hoặc tạo mới |
SyntaxError ở if x = 5 | Nhầm gán với so sánh | Dùng == |
'str' object has no attribute ... | Biến giữ kiểu khác dự đoán | In type() để kiểm tra |
| Gán nối tiếp tạo list dùng chung | a = b = [] | Tạo riêng từng biến |
| Tên biến che module | Đặt tên json, random | Đổi tên biến |
Tóm tắt
- Biến là nhãn gắn vào giá trị; gán lại tạo nhãn mới, không sửa giá trị cũ.
- Kiểu động linh hoạt nhưng không bảo vệ khỏi lỗi kiểu; type hint giúp.
x, y = y, xhoán đổi không cần biến tạm.- Theo PEP 8:
snake_casecho biến/hàm,UPPER_CASEcho hằng số. =là gán,==là so sánh.
Dùng ← → để chuyển bài