Tại sao bool là một lớp con của int?


84

Khi lưu trữ bool trong memcached qua python-memcached, tôi nhận thấy rằng nó được trả về dưới dạng số nguyên. Kiểm tra mã của thư viện cho tôi thấy rằng có một nơi isinstance(val, int)được kiểm tra để gắn cờ giá trị dưới dạng số nguyên.

Vì vậy, tôi đã thử nghiệm nó trong python shell và nhận thấy những điều sau:

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

Nhưng tại sao chính xác là boolmột lớp con của int?

Nó có ý nghĩa vì một boolean về cơ bản là một int có thể chỉ nhận hai giá trị nhưng nó cần ít hoạt động / không gian hơn nhiều so với một số nguyên thực tế (không có số học, chỉ có một bit không gian lưu trữ) ....



1
Cần lưu ý rằng vì trong Python, mọi thứ đều là một đối tượng, với chi phí sử dụng, việc cố gắng tiết kiệm không gian bằng cách làm boolnhỏ hơn là vô nghĩa . Nếu bạn quan tâm đến việc sử dụng bộ nhớ, bạn sẽ sử dụng một ngôn ngữ khác để bắt đầu.
kindall

Câu trả lời:


101

Từ nhận xét trên http://www.peterbe.com/plog/bool-is-int

Điều đó là hoàn toàn hợp lý, nếu bạn ở khoảng thời gian loại bool được thêm vào python (đôi khi khoảng 2.2 hoặc 2.3).

Trước khi giới thiệu loại bool thực tế, 0 và 1 là đại diện chính thức cho giá trị chân lý, tương tự như C89. Để tránh phá vỡ mã không lý tưởng nhưng hoạt động một cách không cần thiết, kiểu bool mới cần hoạt động giống như 0 và 1. Điều này không chỉ đơn thuần là giá trị chân lý, mà còn là tất cả các phép toán tích phân. Không ai khuyên bạn nên sử dụng kết quả boolean trong ngữ cảnh số, cũng như hầu hết mọi người đều khuyên bạn nên kiểm tra tính bình đẳng để xác định giá trị chân lý, không ai muốn tìm ra cách khó khăn là có bao nhiêu mã hiện có theo cách đó. Do đó, quyết định thực hiện True và False giả trang lần lượt là 1 và 0. Đây chỉ đơn thuần là một hiện vật lịch sử của quá trình tiến hóa ngôn ngữ.

Tín dụng được chuyển đến dman13 cho lời giải thích tốt đẹp này.


2
Lưu ý rằng điều này có thể đúng về mặt lịch sử, nhưng về mặt thành ngữ, bạn thấy rất nhiều sum([f(value) for value in values])nơi f(x)là một số loại chức năng của bộ lọc và bạn cần xem có bao nhiêu giá trị vượt qua bộ lọc.
Adam Smith,

2
Cá nhân tôi muốn viết sum(1 for value in values if f(value)), nhưng tôi đã thực sự thấy những người được kính trọng ủng hộ các phép toán số trên bools.
Marius Gedminas

28

Xem PEP 285 - Thêm loại bool . Đoạn phát hành:

6) Bool có nên kế thừa từ int không?

=> Có.

Trong một thế giới lý tưởng, bool có thể được triển khai tốt hơn dưới dạng một kiểu số nguyên riêng biệt biết cách thực hiện số học ở chế độ hỗn hợp. Tuy nhiên, việc kế thừa bool từ int làm giảm bớt việc triển khai rất nhiều (một phần vì tất cả mã C gọi PyInt_Check () sẽ tiếp tục hoạt động - điều này trả về true cho các lớp con của int).


0

Cũng có thể sử dụng helpđể kiểm tra Boolgiá trị của trong Console:

giúp đỡ (Đúng)

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.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
 |  

trợ giúp (Sai)

help(False)
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.
 |  
 |  Method resolution order:
 |      bool
 |      int
 |      object
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.