DHDataHọc
TheoryLesson 3/305 min read+10 XP

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:

code
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:

code
x = 10
y = x
x = 20
print(x, y)
code
20 10

Dò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ụ:

code
a = [1, 2]
b = a
b.append(3)
print(a, b)
print(a is b)
code
[1, 2, 3] [1, 2, 3]
True

a 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:

code
value = 3.14
print(type(value))
value = "pi"
print(type(value), value)
code
<class 'float'>
<class 'str'> pi

Khô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ư:

code
price = "890000"
quantity = 2
print(price * quantity)
code
890000890000

Chạ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:

code
def total(price: float, quantity: int) -> float:
    return price * quantity

Type 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:

code
x, y = 1, 2
x, y = y, x
print(x, y)
code
2 1

Vế 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ị:

code
a = b = c = 0

Gá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:

code
list_a = list_b = []
list_a.append(1)
print(list_b)
code
[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:

code
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ạiQuy ướcVí dụ
Biến, hàmsnake_casetotal_price, tinh_diem
Hằng sốUPPER_CASEMAX_RETRY, PI
LớpPascalCaseDataFrame, Customer
Module, góisnake_case ngắnpandas, 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":

code
MAX_RETRY = 3
TAX_RATE = 0.08

Khô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à ==:

code
x = 5        # gán
print(x == 5)  # so sánh → True
print(x == 6)  # → False

Lỗi kinh điển của người mới:

code
if x = 5:
    ...
code
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

  1. Chạy thí nghiệm x = 10; y = x; x = 20 và giải thích kết quả bằng khái niệm "nhãn".
  2. Tạo list a, gán b = a, thêm phần tử qua b, xem a. Làm lại với b = a.copy().
  3. Hoán đổi hai biến bằng một dòng, không dùng biến tạm.
  4. Đặt tên lại một đoạn code mẫu theo PEP 8.
  5. Viết if x = 5 và đọc gợi ý lỗi của Python.
  6. 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ứngNguyên nhânCách sửa
NameErrorDùng trước khi gán hoặc gõ sai tênGán trước, kiểm tra chính tả
Hai biến đổi cùng lúcCùng trỏ một list/dict.copy() hoặc tạo mới
SyntaxError ở if x = 5Nhầm gán với so sánhDùng ==
'str' object has no attribute ...Biến giữ kiểu khác dự đoánIn type() để kiểm tra
Gán nối tiếp tạo list dùng chunga = 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, x hoán đổi không cần biến tạm.
  • Theo PEP 8: snake_case cho biến/hàm, UPPER_CASE cho hằng số.
  • = là gán, == là so sánh.

Use ← → to move between lessons