TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Khi đang code Python, bạn bấm Run và… “bùm”:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Thông báo lỗi thì dài, toàn tiếng Anh, nhìn khá “hầm hố”. Nhưng ý của Python thật ra rất đời thường:

“Bạn đang cố cộng số nguyên (int) với chuỗi (str). Tôi không biết phải xử lý kiểu gì.”

Bạn xem thêm:

LÀM CHỦ PYTHON

Bài viết này sẽ giúp bạn:

  • Hiểu chính xác lỗi này nghĩa là gì (không còn sợ chữ “TypeError”).

  • Thấy được Python đang hiểu đoạn code của bạn như thế nào, tại sao nó “giận dữ”.

  • Biết cách sửa đúng trong từng tình huống hay gặp: in ra màn hình, xử lý input, đọc file, làm việc với JSON, với None, v.v.

  • Nắm một số best practice để về sau gần như… không còn gặp lại lỗi này nữa (hoặc có gặp là fix trong vài chục giây).


1. Lỗi TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì?

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Trong Python, TypeError xuất hiện khi bạn dùng toán tử hoặc hàm với một kiểu dữ liệu không phù hợp.

Thông báo đầy đủ:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Tách nhỏ ra:

  • TypeError
    → Lỗi liên quan tới kiểu dữ liệu (type), không phải lỗi cú pháp.

  • unsupported operand type(s) for +
    → Toán tử + chỉ chấp nhận những kiểu “hợp nhau”, ví dụ:

    • int + int (2 + 3)

    • float + float (2.5 + 3.1)

    • str + str (“Hello ” + “world”) → nối chuỗi

    Nhưng ở đây, hai bên lại không hợp.

  • 'int' and 'str'
    → Một bên là int, bên kia là str.
    Python đang mách bạn: “Hai kiểu này không dùng + trực tiếp với nhau được đâu.”

Nói gọn lại:

Bạn đang dùng + giữa số nguyênchuỗi. Python không biết bạn muốn cộng số hay nối chuỗi → nó từ chối và ném TypeError.


2. Toán tử + trong Python hoạt động thế nào?

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Để hiểu tận gốc, cần biết Python mong đợi điều gì khi gặp dấu +.

2.1. + với số: cộng số học

Ví dụ:

a = 10 # int
b = 5 # int
c = 2.5 # float
print(a + b) # 15
print(a + c) # 12.5

Các kiểu số (int, float, Decimal, Fraction…) có thể cộng với nhau, miễn là Python biết cách chuyển đổi (promote) giữa chúng.

2.2. + với chuỗi: nối chuỗi

first = "Hello "
second = "world"
print(first + second) # "Hello world"

Ở đây + không còn là “cộng số”, mà là concatenate (nối chuỗi).

2.3. Vậy tại sao int + str lại lỗi?

Hãy xem ví dụ “quen mặt”:

age = 25
message = "Năm nay tôi " + age + " tuổi"

Trong đầu người:

“Nối chuỗi thôi mà: ‘Năm nay tôi ’ + 25 + ‘ tuổi’.”

Nhưng Python thì thấy:

  • "Năm nay tôi "str

  • ageint

  • " tuổi"str

Nó phải trả lời câu hỏi:

  • Có nên chuyển "Năm nay tôi " sang số? (vô lý)

  • Hay chuyển age thành chuỗi? (có vẻ hợp lý, nhưng Python không tự đoán trong một biểu thức hỗn hợp như thế này)

Vì Python không thích “ngồi đoán”, nó ném:

TypeError: unsupported operand type(s) for +: 'str' and 'int'

Nguyên tắc: Python chỉ cho dùng + giữa những kiểu mà nó biết rõ cách xử lý. int + str không nằm trong danh sách đó.


3. Những tình huống thực tế dễ dính lỗi này

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Dưới đây là các case rất hay gặp trong thực tế (khi dạy/làm việc Python cho người mới, trường hợp này xuất hiện liên tục).

3.1. In thông báo có số (format output)

Code hay thấy:

price = 10
extra = 5
message = "Tổng là: " + price + extra
print(message)

Python hiểu:

  • "Tổng là: "str

  • priceint

  • extraint

Và bạn sẽ nhận được:

TypeError: unsupported operand type(s) for +: 'str' and 'int'

Cách sửa đúng:

  • Cộng số trước, rồi chuyển kết quả sang chuỗi:

price = 10
extra = 5
total = price + extra
message = "Tổng là: " + str(total)
print(message)
  • Hoặc gọn hơn với f-string (Python 3.6+):

price = 10
extra = 5
total = price + extra
message = f"Tổng là: {total}"
print(message)

Best practice: Với Python 3.6+, ưu tiên f-string, vừa ngắn vừa dễ đọc, khỏi lo ép kiểu chuỗi.


3.2. Dữ liệu từ input() (luôn là chuỗi)

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Mặc định, input() trong Python luôn trả về str.

a = input("Nhập số a: ")
b = input("Nhập số b: ")
result = a + b
print(result)Nếu bạn nhập 12, kết quả sẽ là:
12

→ Không phải lỗi, nhưng logic sai: bạn đang nối chuỗi, không phải cộng số.

Nếu sau đó bạn thử:

print("Kết quả là: " + result + 1)

Thì sẽ dính ngay TypeError vì resultstr, còn 1int.

Cách đúng để tính tổng số:

a = input("Nhập số a: ")
b = input("Nhập số b: ")
total = int(a) + int(b)
print(f”Kết quả là: {total}“)Cách đúng nếu chỉ muốn nối chuỗi “thông báo”:
a = input("Nhập số a: ")
b = input("Nhập số b: ")
message = “Bạn vừa nhập: “ + a + ” và “ + b
print(message)Ở đây tất cả operand của + đều là str → Python nối chuỗi bình thường.

3.3. Dữ liệu từ JSON, file CSV, database…

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Rất nhiều khi, dữ liệu “trông như số” nhưng thực ra lại là chuỗi.

Ví dụ:

row = {"price": "100", "discount": 5}
final_price = row["price"] - row["discount"]
  • row["price"]"100"str

  • row["discount"]5int

→ Bạn sẽ gặp:

TypeError: unsupported operand type(s) for -: 'str' and 'int'

Cách xử lý chuẩn: chuẩn hóa kiểu ngay sau khi đọc dữ liệu:

row = {"price": "100", "discount": 5}

price = int(row[“price”])
discount = int(row[“discount”])
final_price = price – discount

print(final_price)

Quy tắc vàng:
Sau khi đọc dữ liệu từ bên ngoài (input, file, API, DB…), hãy chuyển về đúng kiểu bạn cần dùng (int/float/str/…) càng sớm càng tốt.


3.4. Làm việc với None mà tưởng là số

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Biến thể khác của TypeError:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Ví dụ:

def get_bonus(user_id):
# TODO: chưa viết logic, tạm trả về None
return None
salary = 1000
bonus = get_bonus(123)
total = salary + bonus
print(total)bonusNone, không phải số.

Cách né:

  • Hoặc đảm bảo hàm trả về 0 nếu không có thưởng:

def get_bonus(user_id):
# Nếu không có thưởng, trả về 0 thay vì None
return 0
salary = 1000
bonus = get_bonus(123)
total = salary + bonus
print(total)
Hoặc kiểm tra None trước khi tính:
salary = 1000
bonus = get_bonus(123)
if bonus is None:
bonus = 0total = salary + bonus
print(total)

3.5. Cộng dồn trong vòng lặp với biến khởi tạo sai kiểu

Ví dụ:

numbers = [1, 2, 3] total = "" # nghĩ là "biến tổng", nhưng lại khởi tạo là chuỗifor n in numbers:
total = total + nprint(total)Ở lần lặp đầu tiên, Python phải xử lý " " + 1str + int → TypeError.

Cách đúng:

numbers = [1, 2, 3] total = 0 # khởi tạo đúng kiểufor n in numbers:
total = total + nprint(total)Hoặc dùng sẵn hàm sum():

numbers = [1, 2, 3] total = sum(numbers)
print(total)

4. Quy trình 5 bước debug khi gặp lỗi này

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Mỗi lần gặp TypeError kiểu:

unsupported operand type(s) for +: 'int' and 'str'

Bạn có thể theo 5 bước cố định:

Bước 1: Xác định dòng code gây lỗi

Stack trace luôn chỉ rõ dòng cụ thể. Đừng nhìn cả file, hãy tập trung vào dòng đó.

Bước 2: Nhìn vào toán tử gây lỗi (ở đây là +)

Đặt câu hỏi:

“Hai bên dấu + đang là biến/biểu thức gì?”

Bước 3: In type() của từng vế

Thêm tạm vào trước dòng gây lỗi:

print(type(left_operand), left_operand)
print(type(right_operand), right_operand)

Ví dụ thực tế:

print(type(price), price)
print(type(extra), extra)
message = "Tổng là: " + price + extra

Kết quả in ra sẽ “bóc phốt” ngay:

<class 'int'> 10
<class 'int'> 5

→ Bạn sẽ biết mình đang cố str + int hay int + str.

Bước 4: Quyết định “muốn cộng số hay nối chuỗi?”

  • Nếu muốn cộng số → đảm bảo cả hai vế đều là số (int / float…), ép chuỗi sang số nếu cần.

  • Nếu muốn nối chuỗi → đảm bảo tất cả vế là str, ép số sang chuỗi với str() hoặc dùng f-string.

Bước 5: Chuẩn hóa kiểu & chạy lại

  • Thêm int(), float(), str() tại đúng chỗ.

  • Chạy lại, nếu vẫn lỗi → quay lại bước 3 check type() lần nữa.

Sau khi bạn quen quy trình này, chỉ nhìn lỗi + một dòng print(type(...)) là sửa xong trong 30 giây.


5. Cách viết code an toàn hơn để tránh TypeError kiểu này

TypeError: unsupported operand type(s) for +: 'int' and 'str' là gì? Cách sửa chi tiết trong Python
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

5.1. Rõ ràng về kiểu dữ liệu ngay từ “cửa vào”

Mỗi khi:

  • Đọc dữ liệu từ input

  • Đọc file CSV/JSON

  • Gọi API / database

Hãy chuyển về kiểu bạn muốn dùng ngay sau khi nhận:

age_str = input("Nhập tuổi: ")
age = int(age_str)
price_str = row[“price”] # “100”
price = int(price_str)

5.2. Ưu tiên f-string thay cho + khi in/log

Thay vì:

message = "Tổng là: " + str(total)
print(message)

Hãy dùng:

print(f"Tổng là: {total}")

Ưu điểm:

  • Ngắn, dễ đọc

  • Không phải nhớ ép kiểu str()

  • Khi đổi nội dung cũng ít lỗi hơn

5.3. Dùng type()isinstance() khi nghi ngờ

Khi logic phức tạp (nhiều source dữ liệu), bạn có thể dùng:

if not isinstance(price, (int, float)):
raise TypeError("price phải là số")

Điều này giúp phát hiện lỗi sớm, trước khi tới các phép tính.

5.4. Thiết kế hàm rõ ràng về input / output

Ví dụ:

def calc_total(price: int, extra: int) -> int:
return price + extra
  • Ghi chú bằng type hint giúp IDE và tool (mypy, pylance) cảnh báo nếu bạn truyền sai kiểu.

  • Trong docstring cũng có thể ghi: “price, extra: int”.


6. Ôn lại nhanh: ép kiểu trong Python

7 Sai Lầm Kế Toán Trên Excel Và Cách Kiểm Tra Đối Chiếu Số Liệu
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Các hàm ép kiểu thông dụng:

  • int(x) → chuyển x sang số nguyên (nếu có thể).

    • "10"10

    • "10.5" → lỗi (phải dùng float() trước).

  • float(x) → chuyển sang số thực.

    • "10"10.0

    • "10.5"10.5

  • str(x) → chuyển sang chuỗi.

    • 10"10"

    • True"True"

Khi bạn ép kiểu, nên:

  • Dùng try/except nếu dữ liệu từ người dùng có thể nhập sai:

value = input("Nhập số: ")
try:
number = int(value)
except ValueError:
print("Bạn phải nhập một số nguyên hợp lệ!")

7. Các lỗi “anh em họ hàng” của lỗi này

Khi hiểu được lỗi 'int' and 'str', bạn cũng dễ dàng hiểu các biến thể khác:

  • TypeError: unsupported operand type(s) for -: 'str' and 'int'

  • TypeError: unsupported operand type(s) for /: 'str' and 'int'

  • TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

  • TypeError: can only concatenate str (not "int") to str

Tất cả đều cùng một thông điệp:

“Bạn đang dùng toán tử số học / nối chuỗi giữa các kiểu dữ liệu không hợp nhau. Hãy ép kiểu rõ ràng.”


8. Checklist nhanh trước khi bấm Run (chống TypeError)

7 Sai Lầm Kế Toán Trên Excel Và Cách Kiểm Tra Đối Chiếu Số Liệu
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ là gì? Cách sửa chi tiết trong Python

Trước khi chạy những đoạn code có tính toán / in thông báo, bạn có thể tự hỏi:

  1. Biến này từ đâu ra? (input, file, JSON, DB…)

  2. Kiểu thực sự của biến là gì?

    • Hãy dùng print(type(x), x) nếu không chắc.

  3. Mình muốn làm gì?

    • Cộng số → tất cả phải là số (int/float/...)

    • Nối chuỗi → tất cả phải là chuỗi (str)

  4. Đã ép kiểu rõ ràng chưa?

    • int(), float(), str() ở đúng chỗ.

  5. Khi hiển thị ra màn hình/log, đã dùng f-string chưa?

    • Giảm rủi ro quên str().

Nếu 5 câu trên đều “OK”, khả năng cao bạn sẽ không gặp TypeError dạng này nữa.


9. Hiểu lỗi để code tự tin hơn

Tóm lại, lỗi:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

chỉ đang nói một điều rất đơn giản:

“Hãy chọn một: hoặc mọi thứ là số để tôi tính, hoặc mọi thứ là chuỗi để tôi nối. Đừng trộn lẫn mà không nói rõ.”

Khi bạn:

  • Biết đọc thông báo lỗi thay vì chỉ sợ nó.

  • Biết dùng type() để xem biến thực sự đang là kiểu gì.

  • Biết ép kiểu bằng int(), float(), str() và ưu tiên f-string.

  • Rõ ràng về kiểu dữ liệu ngay khi nhận input / dữ liệu từ bên ngoài.

…thì những lỗi TypeError kiểu này sẽ trở thành chuyện rất nhẹ:

  • Thấy lỗi → nhìn dòng báo lỗi → in type() → ép kiểu lại → xong.

LÀM CHỦ PYTHON

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *