2010-05-04 30 views
168

Có đảm bảo rằng False == 0True == 1, bằng Python không? Ví dụ, theo bất kỳ cách nào, đảm bảo rằng mã sau sẽ luôn tạo ra các kết quả tương tự, bất kể phiên bản Python (cả hiện tại và, có khả năng, các phiên bản tương lai) là gì?Là False == 0 và True == 1 trong Python một chi tiết thực hiện hoặc nó được đảm bảo bởi ngôn ngữ?

0 == False # True 
1 == True # True 
['zero', 'one'][False] # is 'zero' 

Mọi tham chiếu đến tài liệu chính thức sẽ được đánh giá cao!

Chỉnh sửa: Như đã lưu ý trong nhiều câu trả lời, bool được kế thừa từ int. Do đó, câu hỏi có thể được gọi lại là: "Tài liệu có chính thức nói rằng các lập trình viên có thể dựa vào các phép toán boolean kế thừa từ các số nguyên, với các giá trị 01?". Câu hỏi này có liên quan để viết mã mạnh mẽ không bị lỗi vì chi tiết triển khai!

+4

Nếu bạn nghi ngờ đó là chi tiết, tại sao không tránh chi tiết? Tại sao hỏi một câu hỏi như thế này? Đó là tầm thường để tránh tùy thuộc vào loại chức năng này. Ví dụ của bạn, sử dụng một từ điển thay vì một danh sách. Bạn gặp vấn đề gì? Tại sao lại hỏi điều này? –

+50

@ S.Lott: Có nhiều lý do để đặt câu hỏi ở trên. Vì vậy, có những trường hợp mà dựa vào booleans là số nguyên làm cho mã của bạn đơn giản hơn: bạn có phải thay đổi nó? Hoặc, bạn có thể phát hiện các vị trí trong một mã được viết bởi người khác dựa trên các boolean là số nguyên: bạn có làm gián đoạn những gì bạn đang sửa đổi trong mã để "sửa" mã hiện tại hay không? ? Có rất nhiều ví dụ khác. Nói chung, nó là tốt để biết các quy tắc của trò chơi, để bạn có thể chơi nó tốt và chương trình một cách âm thanh. – EOL

+0

@EOL: bạn có thể cung cấp một ví dụ về "dựa vào booleans là số nguyên làm cho mã của bạn đơn giản hơn"? Tôi không thể tưởng tượng một điều như vậy. "Bạn có làm gián đoạn những gì bạn đang sửa đổi trong mã để" sửa chữa "mã hiện tại, hoặc bạn có thể yên tâm rằng mã hóa hiện tại là âm thanh?" Câu hỏi này có vẻ kỹ thuật, không phải là "làm cách nào để đối phó?" Các quy tắc rất đơn giản: ** không phụ thuộc vào chi tiết triển khai **. Vậy tại sao hỏi về một chi tiết thực hiện? –

Trả lời

130

Trong Python 2.x đây là không phải là được đảm bảo vì có thể cho TrueFalse được chỉ định lại. Tuy nhiên, ngay cả khi điều này xảy ra, boolean True và boolean False vẫn được trả lại đúng để so sánh.

Trong Python 3.x TrueFalse là từ khóa và sẽ luôn bằng 10.

Trong những trường hợp bình thường bằng Python 2, và luôn luôn bằng Python 3:

False đối tượng là loại bool mà là một lớp con của int:

object 
    | 
int 
    | 
bool 

Đó là lý do duy nhất lý do tại sao trong ví dụ của bạn , ['zero', 'one'][False] không hoạt động.Nó sẽ không hoạt động với một đối tượng không phải là một phân lớp của số nguyên, vì việc lập chỉ mục danh sách chỉ hoạt động với các số nguyên hoặc các đối tượng xác định phương thức __index__ (nhờ mark-dickinson).

Edit:

Đúng là của phiên bản python hiện nay, và điều đó của Python 3. docs for python 2.6docs for Python 3 cả nói:

Có hai loại số nguyên: [.. .] Số nguyên (int) [...] Booleans (bool)

và trong tiểu mục boolean:

Booleans: Các giá trị Boolean hoạt động giống như các giá trị 0 và 1, tương ứng, trong hầu hết các bối cảnh, ngoại lệ là khi được chuyển đổi thành chuỗi, chuỗi "False" hoặc "True" được trả về, tương ứng.

Vì vậy, các phép toán luận được coi là một cách rõ ràng như số nguyên trong Python 2.6 và 3.

Vì vậy, bạn đang an toàn cho đến khi Python 4 đến cùng. ;-)

+2

0 == 0.0 trả về True trong khi ['zero', 'one'] [0.0] không thành công. ['không', 'một'] [Sai] hoạt động vì bool là một phân lớp của int. (int .__ subclasses __() trả về []) – luc

+0

Đồng ý rằng câu trả lời của tôi chưa hoàn thành. :) của bạn điểm đúng lý do tôi đoán – luc

+17

Nitpick: bất kỳ đối tượng nào cung cấp phương thức '__index__' có thể được sử dụng làm chỉ mục danh sách; không chỉ các lớp con của 'int' hoặc' long'. –

-6

Sai là một bool. Nó có một loại khác. Nó là một đối tượng khác với 0 là một số nguyên.

0 == False trả về Đúng vì False được truyền thành số nguyên. int (False) trả về 0

Các tài liệu python của toán tử == nói (trợ giúp ('==')):

Các nhà khai thác <, >, ==, >=, <=, và so sánh != các giá trị của hai đối tượng. Các đối tượng không cần phải có cùng loại. Nếu cả hai là số, chúng sẽ được chuyển đổi thành một loại phổ biến.

Kết quả là False được chuyển thành số nguyên cho nhu cầu so sánh. Nhưng nó khác với 0.

>>> 0 is False 
False 
+20

Điều này không hoàn toàn đúng: 'bool' là một phân lớp của' int', vì vậy theo nghĩa rất thực tế, bool * là * một số nguyên. Ví dụ, 'isinstance (True, int)' trả về True. Và kiểm tra bình đẳng không chuyển đổi bool thành int, vì không cần chuyển đổi: nó đơn giản gọi trực tiếp 'int .__ cmp__'. Lưu ý rằng 'bool .__ cmp__ là int .__ cmp__' cũng đánh giá thành' True'. –

+3

-1 cho câu trả lời này. Mô tả sai về mối quan hệ giữa bool và int (trong Python 2). 'isinstance (Đúng, int)' => Đúng. Tức là, True * IS * một số nguyên và không yêu cầu chuyển đổi. – ToolmakerSteve

+0

Tôi đã có một kịch bản trả về False hoặc Int ... bằng cách sử dụng 'while response is False' làm việc, và' while response == False' không .. Cảm ơn! –

57

Liên kết với PEP thảo luận về loại bool mới trong Python 2.3: http://www.python.org/dev/peps/pep-0285/.

Khi chuyển đổi một bool đến một int, giá trị số nguyên luôn là 0 hoặc 1, nhưng khi chuyển đổi một int để một bool, giá trị boolean là True cho tất cả các số nguyên trừ 0.

>>> int(False) 
0 
>>> int(True) 
1 
>>> bool(5) 
True 
>>> bool(-5) 
True 
>>> bool(0) 
False 
18

Trong Python 2.x, nó không được bảo đảm ở tất cả:

>>> False = 5 
>>> 0 == False 
False 

Vì vậy, nó có thể thay đổi. Trong Python 3.x, True, False và None là reserved words, vì vậy mã trên sẽ không hoạt động. Nói chung, với booleans bạn nên giả định rằng trong khi False sẽ luôn luôn có một giá trị số nguyên là 0 (miễn là bạn không thay đổi nó, như trên), True có thể có bất kỳ giá trị nào khác. Tôi sẽ không nhất thiết phải dựa vào bất kỳ sự đảm bảo nào là True==1, nhưng trên Python 3.x, điều này sẽ luôn luôn xảy ra, bất kể là gì.

+2

Re "True có thể có bất kỳ giá trị khác. Tôi sẽ không nhất thiết phải dựa vào bất kỳ đảm bảo rằng True == 1". Trên thực tế, bạn CÓ THỂ dựa vào True == 1, theo http://www.python.org/dev/peps/pep-0285/ và spec http://docs.python.org/2/reference/datamodel. html # the-standard-type-hierarchy "Các giá trị Boolean hoạt động giống như các giá trị 0 và 1, tương ứng, trong hầu hết các ngữ cảnh ..." Tôi không nói rằng không thể ghi đè điều này trong Py 2 bằng cách gán lại True hoặc False, nhưng tôi nói rằng trừ khi một số lập trình viên trong dự án của bạn là một kẻ ngốc và thực hiện việc tái chỉ định đó, hành vi đó được đảm bảo. – ToolmakerSteve

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