2016-06-30 17 views
38

Kể từ TrueFalse là trường hợp của int, sau đây là hợp lệ bằng Python:Có sử dụng hợp pháp danh sách [True], liệt kê [False] bằng Python không?

>>> l = [0, 1, 2] 
>>> l[False] 
0 
>>> l[True] 
1 

Tôi hiểu tại sao điều này xảy ra. Tuy nhiên, tôi thấy hành vi này hơi bất ngờ và có thể dẫn đến các lỗi khó gỡ lỗi. Nó chắc chắn đã cắn tôi một vài lần.

Có ai có thể nghĩ về việc sử dụng hợp pháp danh sách lập chỉ mục với True hoặc False?

+3

[Đây là một loạt ví dụ] (http://www.petercollingridge.co.uk/python-tricks/boolean) -indices). –

+21

Hữu ích cho mã golf: in (('ko', 'ok') [a polku

+8

Mã python hợp lệ, cho dù đó là "hợp pháp" sử dụng thì chủ yếu là vấn đề của ý kiến. – skyking

Trả lời

59

Trong quá khứ, một số người đã sử dụng hành vi này để tạo ra một kém của con người conditional expression:

['foo', 'bar'][eggs > 5] # produces 'bar' when eggs is 6 or higher, 'foo' otherwise 

Tuy nhiên, với một proper conditional expression đã được thêm vào ngôn ngữ Python 2.5, điều này được rất nhiều tán thành , vì những lý do bạn nói: dựa vào boolean là một phân lớp của các số nguyên là quá 'huyền diệu' và không đọc được đối với người duy trì.

Vì vậy, trừ khi bạn là mã chơi golf (cố tình sản xuất mã rất nhỏ gọn và che khuất), sử dụng

'bar' if eggs > 5 else 'foo' 

thay vào đó, trong đó có các lợi thế thêm rằng hai biểu thức này chọn giữa là uể oải được đánh giá; nếu eggs > 5 là sai, biểu thức trước if sẽ không bao giờ được thực thi.

+0

nhưng làm thế nào nó thực sự làm việc Martin? tôi đã thử danh sách l = [2, 0, 1] chỉ để xem những gì nó mang lại lợi nhuận sai 2 và True 0 .. –

+7

@ Ev.Kounis: 'True == 1',' False == 0', bởi vì booleans là một lớp con của 'int'. Vì 'trứng> 5' tạo ra một boolean, nhưng việc lập chỉ mục lấy giá trị số nguyên,' trứng> 5' là 'True' tạo ra' ['foo', 'bar'] [1] ', nếu không' ['foo', ' bar '] [0] 'được tạo ra. –

+0

Hình thức thay thế vẫn còn rõ ràng hơn nếu thực thể bạn đang lập chỉ mục là chi tiết? 'x = available_options [choice] .response_text [int (n <9)]' có thể? Tôi chắc chắn sẽ tranh luận để luôn đặt 'int()' đó vào để làm cho nó dễ đọc hơn, mặc dù nó không phải là ngôn ngữ không phải bởi các định nghĩa ngôn ngữ. – nigel222

35

Nếu bạn đang bối rối vì sao bool là một đối số chỉ số hợp lệ: đây chỉ đơn giản là cho quán với thực tế là bool là một lớp con của int và bằng Python nó một kiểu số.

Nếu bạn hỏi tại sao bool là một loại số ở vị trí đầu tiên thì bạn phải hiểu rằng bool không có trong phiên bản cũ của Python và người dùng sử dụng int s thay thế.

Tôi sẽ thêm một chút đối số lịch sử. Đầu tiên của việc bổ sung bool trong python được mô tả ngắn gọn trong Guido van Rossum (aka BDFL) blogpost: The History of Python: The history of bool, True and False. Loại đã được thêm vào qua PEP 285.

PEP chứa thực tế lý do được sử dụng cho các quyết định này. Tôi sẽ trích dẫn một số phần của PEP bên dưới.

4) Chúng ta có nên cố gắng loại bỏ các hoạt động phi Boolean trên bools trong tương lai, thông qua các cảnh báo phù hợp, do đó ví dụ True+1 sẽ cuối cùng (bằng Python 3000) là bất hợp pháp?

=> số

Có một thiểu số nhỏ nhưng giọng hát mà muốn để xem "sách giáo khoa" bools không hỗ trợ phép tính số học tại tất cả, nhưng hầu hết người nhận xét đồng ý với tôi rằng bools nên luôn cho phép hoạt động số học.


6) nên bool kế thừa từ int?

=> 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 loại số nguyên riêng biệt biết cách thực hiện chế độ hỗn hợp số học. Tuy nhiên, kế thừa bool từ int giúp giảm bớt việc thực hiện vô cùng (một phần vì tất cả các mã C mà các cuộc gọi PyInt_Check() sẽ tiếp tục làm việc - điều này trả về true cho lớp con của int). Ngoài ra, tôi tin rằng điều này phù hợp với điều khoản của khả năng thay thế: mã yêu cầu int có thể được cấp bool và nó sẽ hoạt động giống như 0 hoặc 1. Mã yêu cầu bool có thể không hoạt động khi được cấp int; ví dụ: 3 là 0, nhưng cả 3 và 4 đều đúng khi được xem là giá trị thực tế .


bool thừa hưởng từ int, True+1 là hợp lệ và bằng 2, và vân vân. Điều này rất quan trọng đối với khả năng tương thích ngược: bởi vì so sánh và do đó trên các giá trị số nguyên hiện đang trả về, không có cách nào cách nói những gì sử dụng các ứng dụng hiện có làm cho các giá trị này.


Vì tương thích ngược, kiểu bool thiếu nhiều tính rằng một số muốn thấy. Ví dụ, số học hoạt động với một hoặc hai đối số bool được cho phép, xử lý Sai là 0 và True là 1. Ngoài ra, một bool có thể được sử dụng như một chuỗi chỉ mục.

Tôi không thấy vấn đề này là vấn đề và tôi cũng không muốn phát triển ngôn ngữ theo hướng này. Tôi không tin rằng việc giải thích chặt chẽ hơn về "Booleanness" sẽ làm cho ngôn ngữ đó trở nên rõ ràng hơn .


Tóm tắt:

  • tương thích ngược: đã có rất nhiều mã đã sử dụng int s 01 để đại diện cho FalseTrue và một số của nó sử dụng những giá trị trong số tính toán.
  • Nó không được xem là một vấn đề lớn để có một "phi sách giáo khoa" bool loại
  • Rất nhiều người trong cộng đồng Python muốn các tính năng này
  • BDFL nói như vậy.
4

Thường có những cách tốt hơn, nhưng các chỉ số Boolean có mục đích sử dụng của chúng. Tôi đã sử dụng chúng khi tôi muốn chuyển đổi kết quả boolean thành một thứ gì đó mà con người có thể đọc được:

test_result = run_test() 
log.info("The test %s." % ('Failed', 'Passed')[test_result]) 
Các vấn đề liên quan