2012-04-21 61 views
9

thể trùng lặp:
Is False == 0 and True == 1 in Python an implementation detail or is it guaranteed by the language?Có đảm bảo rằng False "là 0" và True "là 1" không?

tôi nhận thấy ngày hôm nay rằng các công việc sau sử dụng python 2.6 (CPython) ...

>>> a=[100,200] 
>>> a[True] 
200 
>>> a[False] 
100 

Đây có phải là di động để triển khai python khác (ví dụ: True/False được đảm bảo kế thừa từ int? Là True g uaranteed để đánh giá 1 thay vì một số khác khác không số?) Có bất kỳ tình huống mà điều này sẽ hữu ích? Nó có vẻ như nó có thể được sử dụng như một hình thức của một nhà điều hành ternary, nhưng tôi không biết bao nhiêu là đạt được có ...

+6

(Không phải là câu trả lời, nhưng bạn có thể thấy nó thú vị: Trong Python 2.6 và trước True và False chỉ là biến vì vậy ... 'True, False =" hello "," world "' ... nhưng chúng có * reserved * status trong Python 3.x) –

+0

Theo như tôi biết, True và False là các nhãn cho 1 và 0. 1 == True và 0 == False. Do đó, nó sẽ trả về các mục 0 và 1 trong danh sách –

+0

@gwynhowell: không, 'True' và' False' là các đối tượng ở bên phải của riêng chúng, kiểu 'bool'. –

Trả lời

11

Đó là part of the language specification, vì vậy bất kỳ Python thực hiện nên thực hiện các phép toán luận như tương đương với các số nguyên.

Booleans

Những đại diện cho sự thật giá trị False và True. Hai đối tượng biểu diễn các giá trị False và True là các đối tượng Boolean duy nhất. Kiểu Boolean là một kiểu con của các số nguyên đơn giản, và 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, ngoại lệ là khi được chuyển đổi thành chuỗi, các chuỗi "False" hoặc "True" được trả về tương ứng.

4

Có - này được đảm bảo - với sự báo trước rằng TrueFalse có thể được bố trí; nhưng điều đó không ảnh hưởng đến kết quả của các phép toán boolean. (Cảm ơn Ignacio cho bằng chứng tài liệu.) Trong thực tế, trở lại khi không có toán tử bậc ba, đây là một trong những phương pháp được sử dụng để mô phỏng nó. Ngày nay, nếu bạn muốn một toán tử bậc ba, hãy sử dụng toán tử bậc ba. Nhưng đôi khi cấu trúc này vẫn hữu ích. Ví dụ:

>>> even_odd = [[], []] 
>>> for i in range(10): 
...  even_odd[i % 2 == 1].append(i) 
... 
>>> print even_odd 
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] 

Bạn cũng có thể làm điều này bằng từ điển. Nó có một toán tử ternary tương đương ...

>>> even, odd = [], [] 
>>> for i in range(10): 
...  (even if i % 2 == 1 else odd).append(i) 
... 
>>> even, odd 
([1, 3, 5, 7, 9], [0, 2, 4, 6, 8]) 

Nhưng tôi thực sự tìm thấy phiên bản danh sách lập chỉ mục dễ đọc hơn, ít nhất trong trường hợp này. YYMV.

+0

+1 để có ví dụ tuyệt vời. – mgilson

+0

Không dễ dàng hơn khi nói 'even_odd [i% 2] .append (i)'? – thebjorn

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