2015-07-15 22 views
6

Tôi có một dòng mã trong tập lệnh của tôi có cả hai toán tử này được xích lại với nhau. Từ tài liệu tham khảo tài liệu BOOLEAN AND có mức ưu tiên thấp hơn COMPARISON GREATER THAN. Tôi nhận được kết quả bất ngờ ở đây trong mã này:Ưu tiên toán tử Python - và lớn hơn

>>> def test(msg, value): 
...  print(msg) 
...  return value 

>>> test("First", 10) and test("Second", 15) > test("Third", 5) 
First 
Second 
Third 
True 

Tôi đã chờ đợi thứ hai hoặc thứ ba kiểm tra để xảy ra trước khi nắm tay một, vì > điều hành có độ ưu tiên cao hơn. Tôi làm gì sai ở đây?

https://docs.python.org/3/reference/expressions.html#operator-precedence

+2

Cách giải thích boolean của giá trị đầu tiên của bạn, '10', cũng đúng. Do đó, '10 và 15> 5 == 10 và (15> 5) == 10 và True == True' – Finwood

+0

Nhưng tại sao thông dịch viên nhận được 10 thông tin trước 15 hoặc 5? Không nên so sánh xảy ra trước khi kiểm tra boolean? –

+0

'test (" First ", 10) và test (" Second ", 15)> test (" Third ", 5)' tương đương với 'test (" First ", 10) và (test (" Second ", 15)> test ("Third", 5)) 'Ngoài ra Python đánh giá' và' [lazily] (https://docs.python.org/3/reference/expressions.html#boolean-operations) – Alik

Trả lời

7

Vì bạn đang xem xét điều sai. call (hoặc gọi hàm) có mức độ ưu tiên cao hơn trên cả and cũng như > (lớn hơn). Vì vậy, các cuộc gọi hàm đầu tiên xảy ra từ trái sang phải.

Python sẽ nhận được kết quả cho tất cả các cuộc gọi hàm trước khi so sánh xảy ra. Điều duy nhất có quyền ưu tiên ở đây sẽ là ngắn mạch, vì vậy nếu test("First",10) trả về Sai, nó sẽ ngắn mạch và trả về Sai.

So sánh và and vẫn xảy ra trong cùng một quyền, đó là kết quả đầu tiên của test("Second", 15) được so sánh với test("Third", 5) (vui lòng lưu ý chỉ các giá trị trả lại (cuộc gọi hàm đã xảy ra trước đó)). Sau đó, kết quả của test("Second", 15) > test("Third", 5) được sử dụng trong hoạt động and.

Từ các tài liệu trên operator precedence -

enter image description here

+0

Điều đó có ý nghĩa hoàn hảo. Cảm ơn bạn. Vì vậy, nếu tôi thay thế các cuộc gọi hàm chỉ bằng các số, tôi sẽ nhận được một kết quả khác, đúng không? –

+0

Đối với những con số không có gì để đánh giá, vì vậy tôi không chắc chắn những gì bạn có nghĩa là do đó? –

+0

Python sẽ nhận được kết quả cho tất cả các cuộc gọi hàm trước khi sự so sánh xảy ra hoặc 'và' xảy ra. Điều duy nhất có quyền ưu tiên ở đây sẽ là ngắn mạch –

3

Một cách để xem những gì đang xảy ra là nhìn vào chính xác cách thức Python được giải thích kết quả này:

>>> x = lambda: test("First", 10) and test("Second", 15) > test("Third", 5) 
>>> dis.dis(x) 
    1   0 LOAD_GLOBAL    0 (test) 
       3 LOAD_CONST    1 ('First') 
       6 LOAD_CONST    2 (10) 
       9 CALL_FUNCTION   2 
      12 JUMP_IF_FALSE_OR_POP 42 
      15 LOAD_GLOBAL    0 (test) 
      18 LOAD_CONST    3 ('Second') 
      21 LOAD_CONST    4 (15) 
      24 CALL_FUNCTION   2 
      27 LOAD_GLOBAL    0 (test) 
      30 LOAD_CONST    5 ('Third') 
      33 LOAD_CONST    6 (5) 
      36 CALL_FUNCTION   2 
      39 COMPARE_OP    4 (>) 
     >> 42 RETURN_VALUE   

Nếu bạn làm tương tự cho 10 and 15 > 5, bạn nhận được:

>>> x = lambda: 10 and 15 > 5 
>>> dis.dis(x) 
    1   0 LOAD_CONST    1 (10) 
       3 JUMP_IF_FALSE_OR_POP 15 
       6 LOAD_CONST    2 (15) 
       9 LOAD_CONST    3 (5) 
      12 COMPARE_OP    4 (>) 
     >> 15 RETURN_VALUE   
Các vấn đề liên quan