Là và bằng

Nếu học Python tại Pymi.vn, chắc chắn bạn biết 1 bí mật ít khi dùng tới: 1 == True và 0 == False:

>>> True == 1 and False == 0
True

Thậm chí có thể đem tính toán:

>>> True + True - False
2

bí mật này dẫn tới một số vấn đề “kỳ lạ sau”.

>>> xs = [False, True, 2, 1, 0]
>>> xs.index(0)
0

sẽ có ít nhất 68% được hỏi trả lời sai câu này, dù trình độ code Python lâu đến mấy. Lý do vì trong thực tế, gần như không bao giờ gặp trường hợp như vậy, việc tạo 1 list chứa cả boolean lẫn integer đã là code quá dở rồi.

Ngày hôm qua, trên “room Telegram chat sách” của Pymi (tham gia Slack vào #chem-gio để ra nhập), thành viên cốt cán @no7kai có đố:

dic = {True: 'yes', 1: 'no', 1.0: 'maybe'}
dic[True]
dic[1]

no7kai> Nhìn code đọc luôn kq ae.

Ta cheating, mang luôn đi chạy

>>> dic = {True: 'yes', 1: 'no', 1.0: 'maybe'}
>>> dic
{True: 'maybe'}

có người sẽ thấy ngạc nhiên, nhưng Python có ghi rõ trong doc (tất nhiên cái phần doc này cũng không mấy ai đọc:

A dictionary’s keys are almost arbitrary values. Values that are not hashable, that is, values containing lists, dictionaries or other mutable types (that are compared by value rather than by object identity) may not be used as keys. Numeric types used for keys obey the normal rules for numeric comparison: if two numbers compare equal (such as 1 and 1.0) then they can be used interchangeably to index the same dictionary entry. (Note however, that since computers store floating-point numbers as approximations it is usually unwise to use them as dictionary keys.)

mapping-types-dict

Khi giá trị bằng nhau, chúng được dùng thay thế nhau

>>> dic
{True: 'maybe'}
>>> dic[1]
'maybe'

Ví dụ ban đầu và ví dụ này, Python đều so sánh == để thực hiện các phép tính.

Hỏi khó

vậy còn set? set([True, 1]) thì trả về mấy phần tử?

img

>>> set([True, 1, 1.0])
{True}

Đăng ký ngay tại PyMI.vn để học Python tại Hà Nội TP HCM (Sài Gòn), trở thành lập trình viên #python chuyên nghiệp ngay sau khóa học.