Các Vấn Đề Thường Gặp trong Python - [1] So sánh None và Boolean
By JoeVu, at: 14:09 Ngày 10 tháng 1 năm 2023
Thời gian đọc ước tính: __READING_TIME__ phút
![Common Python Problems - [1] None and Boolean Comparison](/media/filer_public_thumbnails/filer_public/77/42/7742e31c-7648-4832-8a29-156f77759f04/common_python_problems.png__1500x900_crop_subsampling-2_upscale.png)
![Common Python Problems - [1] None and Boolean Comparison](/media/filer_public_thumbnails/filer_public/77/42/7742e31c-7648-4832-8a29-156f77759f04/common_python_problems.png__400x240_crop_subsampling-2_upscale.png)
Sự nhầm lẫn trong so sánh Boolean trong Python là một vấn đề thường gặp đối với những người đang học lập trình Python. Nó gây ra bởi sự khác biệt trong cách Python đánh giá các toán tử so sánh và các giá trị chúng trả về. Điều này có thể dẫn đến kết quả không mong muốn và sự nhầm lẫn khi so sánh các giá trị, chẳng hạn như khi sử dụng toán tử ==. Hướng dẫn này sẽ cung cấp tổng quan về vấn đề và giải thích cách tránh nó.
1. Sự nhầm lẫn Boolean
Hãy xem đoạn mã này, và suy nghĩ về kết quả bạn đoán cho mỗi câu lệnh. Bạn đoán đúng bao nhiêu câu?
'' == False
False
In [2]: if '':
...: print('chuỗi rỗng là đúng')
...: else:
...: print('chuỗi rỗng là sai')
...:
chuỗi rỗng là sai
bool('') == False
True
0 == False
True
0.0 == False
True
1 == True
True
[] == False
False
{} == False
False
set() == False
False
bool(None) == False
True
None == False
False
None == True
False
a = None
a == None
True
a is None
True
Như có thể thấy ở trên, an toàn để kiểm tra xem một biến KHÔNG phải là một chuỗi rỗng, một list/dict/set rỗng, một giá trị None bằng cách sử dụng
if not variable: # tương đương với: if bool(variable) is not False
print(variable)
Trong khi None
không phải là True, và không phải là False. None là một giá trị đặc biệt.
Hãy xem xét kỹ hơn một vấn đề khác
result = None
for i in range(50):
if i % 99 == 0:
result = i
break
if result:
print(result)
print(result)
Kết quả
0
Vấn đề ở đây là gì?
Đó là vấn đề với so sánh boolean trong if result.
Vì chúng ta đã khởi tạo result là None từ đầu, chúng ta mong đợi result phải không phải None nếu chúng ta đã tìm thấy số chia hết cho 99. Câu trả lời là 0.
Vì vậy, giải pháp chính xác là
result = None
for i in range(50):
if i % 99 == 0:
result = i
break
if result is not None:
print(result)
Kết quả
0