2015-08-24 24 views
9

Vì vậy, tôi đang tìm kiếm tại một số code trực tuyến và tôi tình cờ gặp một dòng (tại dòng 286):
if depth > 0 and best <= -MATE_VALUE is None and nullscore > -MATE_VALUE:
Toán tử so sánh và 'là' - ưu tiên toán tử trong python?

Phần tôi đã hiểu biết rắc rối là best <= -MATE_VALUE is None.

Vì vậy, tôi đã kích hoạt thông dịch viên để xem cách tuyên bố như công việc value1 > value2 is value3.
Vì vậy, tôi đã cố gắng

>>> 5 > 2 is True 
False 

>>> (5 > 2) is True 
True 

>>> 5 > (2 is True) 
True 


Câu hỏi của tôi

Tại sao 5 > 2 is True không True? Và những thứ này thường hoạt động như thế nào?

Cảm ơn.

+3

Tra cứu toán tử chuỗi. Đây thực sự không phải là vấn đề ưu tiên. Việc đầu tiên được xử lý một cách hợp lý như '(5> 2) && (2 là True)', đó là lý do tại sao/cách Python cho phép một cấu trúc 'a user2864740

+1

http://stackoverflow.com/questions/25753474/python-comparison-operators-chaining-grouping-left-to-right, http://stackoverflow.com/questions/101268/hidden-features-of-python/101945 # 101945, http: // stackoverflow.com/questions/25103085/chaining-is-operator, http://stackoverflow.com/q/6074018/2864740 – user2864740

+3

FWIW, dòng này có vẻ rất lạ với tôi - nó không rõ ràng với tôi khi biểu hiện này sẽ là True. Nếu MATE_VALUE là một số (có lẽ là do '-MATE_VALUE'), thì nó sẽ không bao giờ là None (nếu nó là,' -' sẽ không hoạt động.) Vì vậy, nếu dòng không ném một ngoại lệ, nó sẽ không luôn luôn trở lại sai? – DSM

Trả lời

7

Bạn đang nhìn thấy chaining điều hành của python làm việc

5 > 2 is True 

là tương đương với

5>2 and 2 is True 

Bạn có thể thấy điều này ở chỗ

>>> 5>2 is 2 

Returns True.

3

Đầu tiên, 5 > 2 is True tương đương với (5 > 2) and (2 is True) vì chuỗi điều khiển trong python (mục 5.9 here).

Rõ ràng là 5 > 2 đánh giá là True. Tuy nhiên, 2 is True sẽ đánh giá là False vì nó không được chuyển đổi hoàn toàn thành bool. Nếu bạn buộc chuyển đổi, bạn sẽ thấy rằng bool(2) is True sản lượng True. Các tuyên bố khác như số if sẽ thực hiện chuyển đổi này cho bạn, vì vậy if 2: sẽ hoạt động.

Thứ hai, có một sự khác biệt quan trọng giữa is điều hành và == điều hành (lấy từ here):

Sử dụng is khi bạn muốn kiểm tra chống lại bản sắc của một đối tượng (ví dụ kiểm tra để xem if var is None) . Sử dụng == khi bạn muốn kiểm tra bình đẳng (ví dụ: var bằng 3?).

>> [1,2] is [1,2] 
False 

>> [1,2] == [1,2] 
True 

Trong khi điều này không có tác động ngay lập tức về ví dụ này, bạn nên giữ nó trong tâm trí cho tương lai.

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