2012-06-22 23 views
15

Sáng nay, tôi thấy mình viết cái gì đó như:các quy tắc liên quan đến chaining của là gì "==" và bằng Python

if (a == b == c): 
    # do something 

Và rất ngạc nhiên rằng nó đã cho tôi kết quả mong đợi.

Tôi nghĩ rằng nó sẽ hoạt động như:

if ((a == b) == c): 
    # do something 

Nhưng nó rõ ràng là không. Có vẻ như Python đang xử lý câu lệnh đầu tiên khác với câu lệnh thứ hai, điều này rất hay nhưng tôi không thể tìm thấy bất kỳ tài liệu hoặc giải thích nào về vấn đề này.

Tôi đã thử nghiệm và nhận điều này:

In [1]: 2 == 2 == 2 
Out[1]: True 

In [2]: (2 == 2) == 2 
Out[2]: False 

sẽ chăm sóc một người nào đó để giải thích cho tôi những gì là các quy tắc liên quan đến như vậy "chain" của == (hoặc !=)?

Cảm ơn bạn rất nhiều.

+3

Chính thức, nếu a, b, c, ..., y, z là các biểu thức và op1, op2, ..., opN là các toán tử so sánh, thì op1 b op2 c ... y opN z tương đương với a op1 b và b op2 c và ... y opN z, ngoại trừ mỗi biểu thức được đánh giá nhiều nhất một lần. @ http://docs.python.org/reference/expressions.html – georg

+2

Gọn gàng, eh? Bạn cũng có thể làm 'a Thomas

+0

Không phải là tôi quan tâm nhiều, nhưng người giải quyết có thể giải thích lý do tại sao anh ấy bị bỏ phiếu không? – ereOn

Trả lời

24

này làm việc với tất cả các nhà khai thác và so sánh- - ví dụ, bạn cũng có thể làm:

>>> 4 < 5 < 6 
True 
>>> 4 < 5 !=2 
True 

Nói chung, according to the documentation, a op1 b op2 c nơi op1op2 là bất kỳ: <, >, !=, ==, <=, >=, is, is not, in hoặc not in sẽ cho kết quả tương tự như:

a op1 b and b op2 c 

Các tài liệu cũng nói rằng điều này có thể làm việc với nhiều sự so sánh tùy ý, vì vậy:

>>> 5 != '5' != 'five' != (3+2) 
True 

Điều này có thể hơi khó hiểu đôi khi vì nó dường như nói 5 != (3+2) - mỗi toán hạng chỉ được so sánh với các toán tử liền kề, thay vì thực hiện tất cả các kết hợp có thể (không thể chỉ rõ ràng bằng các ví dụ chỉ sử dụng ==, vì nó sẽ không ảnh hưởng đến câu trả lời nếu mọi thứ xác định __eq__).

+0

Cũng hoạt động với 'in' và' not in', ví dụ:'4 trong [4] trong [[4]]' (không phải là tôi đề nghị sử dụng này ...) – interjay

+0

@interjay thực sự và tôi đã thực sự chỉnh sửa những người vào câu trả lời của tôi khi bình luận của bạn xuất hiện. GMTA. :-) – lvc

+1

Cảm ơn bạn rất nhiều vì đã giải thích. Tình yêu của tôi dành cho ngôn ngữ này ngày càng phát triển! ;) – ereOn

12

Theo như tôi biết ví dụ bạn chỉ ra được không chaining.

2 == 2 == 2 là như (2 == 2) and (2 == 2) mà hóa ra là True and True

khi

(2 == 2) == 2 là như (True) == 2

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