2012-10-04 24 views
13

Lập chỉ mục trên danh sách với các giá trị boolean hoạt động tốt. Mặc dù chỉ mục phải là số nguyên.Python Bool và so sánh int và lập chỉ mục trong danh sách với các giá trị boolean

Sau đây là những gì tôi đã cố gắng trong giao diện điều khiển:

>>> l = [1,2,3,4,5,6] 
>>> 
>>> l[False] 
1 
>>> l[True] 
2 
>>> l[False + True] 
2 
>>> l[False + 2*True] 
3 
>>> 
>>> l['0'] 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: list indices must be integers, not str 
>>> type(True) 
<type 'bool'> 

Khi tôi cố gắng l['0'] nó in lỗi mà kiểu int dự kiến ​​trong chỉ số và đó là hiển nhiên. Sau đó, ngay cả loại 'True''False'Bool, việc lập chỉ mục trên danh sách hoạt động tốt và tự động chuyển đổi thành loại int và thực hiện thao tác.

Vui lòng giải thích những gì đang diễn ra trong nội bộ. Tôi đăng câu hỏi lần đầu tiên, vì vậy hãy tha thứ cho tôi vì bất kỳ sai lầm nào.

Trả lời

20

Điều đang xảy ra là các boolean thực tế là số nguyên. Đúng là 1 và False là 0. Bool là một kiểu con của int.

>>> isinstance(True, int) 
True 
>>> issubclass(bool, int) 
True 

Vì vậy, nó không chuyển đổi chúng thành số nguyên, nó chỉ sử dụng chúng làm số nguyên. Trước khi một loại bool tồn tại trong Python, mọi người sử dụng số nguyên 0 để có nghĩa là sai và 1 có nghĩa là đúng. Vì vậy, khi họ thêm một loại bool, họ đã thực hiện các giá trị boolean số nguyên theo thứ tự để duy trì khả năng tương thích ngược với các mã cũ mà sử dụng các giá trị số nguyên. Xem ví dụ http://www.peterbe.com/plog/bool-is-int.)

>>> help(True) 
Help on bool object: 

class bool(int) 
| bool(x) -> bool 
| 
| Returns True when the argument x is true, False otherwise. 
| The builtins True and False are the only two instances of the class bool. 
| The class bool is a subclass of the class int, and cannot be subclassed. 
+2

+1, tôi đã học được điều gì đó. Không biết 'bool' là một lớp con của' int'. – nneonneo

+0

Tôi vừa xem qua bài đăng này quá [link] http://stackoverflow.com/questions/3174392/is-it-pythonic-to-use-bools-as-ints/3175293#3175293) Cảm ơn rất nhiều. – Somesh

2

... Booleans là một subtype của số nguyên đơn giản.

Source.

Như bạn có thể thấy, False0True1.

2

Python sử dụng để thiếu booleans, chúng tôi chỉ sử dụng số nguyên, 0 cho False và bất kỳ số nguyên nào khác cho True. Vì vậy, khi các boolean được thêm vào ngôn ngữ, các giá trị False và True, có thể được xem như các giá trị số nguyên 0 và 1 vẫn còn bởi trình thông dịch, để giúp khả năng tương thích ngược. Bên trong, chúng là các lớp con của int.

Nói cách khác, các phương trình sau đây là đúng:

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

và khi bạn phát hiện ra:

>>> True * 3 
3 

này không kéo dài thành các chuỗi tuy nhiên.

Các vấn đề liên quan