2016-10-21 17 views
9

Tôi đang sử dụng vỏ Python 3.5.2. Tôi đang bối rối về lý do tại sao nó hoạt động như vậy?Đặt hàng hoạt động Không chính xác?

5 > 5**2 
False 
5 > 5**2 == False 
False 
(5 > 5**2) == False 
True 

Thứ tự của các hoạt động xác định rằng ** được thực hiện trước> trước khi == để hoạt động.

Trả lời

11

Câu hỏi thú vị! Lý do cho hành vi này là tất cả các toán tử so sánh trong Python có mức ưu tiên bằng nhau và can be chained.

Vì vậy, so sánh thứ hai của bạn là tương đương với

5 > 25 and 25 == False

trong đó tất nhiên để đánh giá False. Nhưng tôi đồng ý rằng trong trường hợp này, nó không phải là rất trực quan.

+0

Bạn luôn có thể sử dụng dấu ngoặc đơn để ghi đè chaining này: '(5> 5 ** 2) == false' =>' TRUE' – brianpck

+0

@brianpck Đúng vậy, nhưng tại sao bạn đã bao giờ muốn điều đó? So sánh sẽ luôn mang lại giá trị boolean (trừ khi quá tải theo cách không chính thống) và so sánh boolean với ví dụ: Đúng hay sai là thực hành xấu ngay từ đầu. Thay vì '(5> 5 ** 2) == Sai', chỉ cần' không (5> 5 ** 2) ', hoặc' 5 <= 5 ** 2' –

+0

@tobias_k, được cấp, nhưng tiền đề của OP (Tôi hy vọng!) đã được thử nghiệm, không phải giải quyết vấn đề thực tế. Tôi đã viết * nhiều * mã weirder chỉ để có được một xử lý về các tính năng ngôn ngữ. – brianpck

0

5.15. Ưu tiên của toán tử

Bảng sau tóm tắt tiền tố toán tử trong Python, từ ưu tiên thấp nhất (ít nhất là ràng buộc) đến ưu tiên cao nhất (hầu hết ràng buộc). Các nhà khai thác trong cùng một hộp có cùng quyền ưu tiên. Trừ khi cú pháp được đưa ra một cách rõ ràng, các toán tử là nhị phân. Các toán tử trong cùng một nhóm hộp từ trái sang phải (ngoại trừ các phép so sánh, bao gồm các phép thử, tất cả đều có ưu tiên như nhau và chuỗi từ trái sang phải - xem phần So sánh - và lũy thừa, nhóm từ phải sang trái).

5 Expressions - Python

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