2013-11-04 17 views
5

Tôi mới sử dụng Python và trong khi thử các câu lệnh logic logic.Tôi đã xem qua điều này mà tôi không thể hiểu.Có ai đó cho tôi biết điều gì đang xảy ra ở đây trong Python 2.7.Whats sự khác biệt giữa 0 và Giá trị sai trong Python.Boolean Python Giá trị nhầm lẫn

 
>>> 0 or False 
False 
>>> False or 0 
0 

Tại sao trình thông dịch đưa ra các câu trả lời khác nhau?

+0

Lưu ý rằng cả hai giá trị này đều "sai"; nghĩa là, cả hai đều đánh giá thành 'False' trong câu lệnh if. –

Trả lời

6

Bạn đang bị nhầm lẫn bởi hành vi của toán tử or; nó trả về biểu thức đầu tiên chỉ khi đó là giá trị đúng; không 0 cũng không False là đúng vì vậy giá trị thứ hai được trả về:

>>> 0 or 'bar' 
'bar' 
>>> False or 'foo' 
'foo' 

Bất kỳ giá trị mà không phải là số 0, container rỗng, None hoặc False được coi là đúng (lớp tùy chỉnh có thể thay đổi bằng cách thực hiện một phương pháp __bool__ (python 3), __nonzero__ (python 2) hoặc __len__ (chiều dài 0 là trống)

biểu thức thứ hai thậm chí còn không được đánh giá nếu là người đầu tiên là True:.

>>> True or 1/0 
True 

Biểu thức 1/0 sẽ tăng một ngoại lệ ZeroDivision, nhưng thậm chí không được Python đánh giá.

này được diễn tả trong boolean operators documentation:

Khái niệm x or y đầu tiên đánh giá x; nếu x là đúng, giá trị của nó được trả về; nếu không, y được đánh giá và giá trị kết quả được trả về.

Tương tự, and trả về biểu thức đầu tiên nếu là False, nếu không biểu thức thứ hai được trả về.

+0

"Nó trả về biểu thức đầu tiên đúng" Ở đây bằng 0 hoặc False Sai là đúng? –

+0

Tôi không thích câu trả lời này bởi vì biện minh "nó trả về biểu thức đầu tiên là True" không giải thích đầy đủ về hành vi.Một cái gì đó như "nó đi qua các toán hạng và trả về biểu thức đầu tiên là True, hoặc toán hạng cuối cùng gặp phải", trong khi ít thanh lịch, tốt hơn sẽ giải thích hành vi gặp phải. –

+0

@WaleedKhan: đã điều chỉnh từ ngữ. –

1

Bản chất của hành vi này là theo thứ tự python là expression evaluation. Python đánh giá các biểu thức từ trái sang phải và thực hiện nó trong một lazy manner. Điều này có nghĩa, rằng những người thông dịch đạt đến điểm, khi giá trị của biểu thức là True, bất kể phần còn lại của biểu thức, nó sẽ theo các chi nhánh của công việc, kết hợp với biểu thức. Nếu không có biểu thức nào là True, nó sẽ chỉ trả lại gần đây nhất (số cuối). Điều này mang lại lợi ích của việc tiết kiệm tài nguyên tính toán. Hãy xem xét mã sau:

>>>False or False or True or range(10**8) 
True 
>>> 

Lưu ý rằng range(10**8) không bao giờ được gọi trong trường hợp này, do đó, rất nhiều thời gian được lưu.