2012-02-14 40 views
143

Khi tôi đang xem câu trả lời cho this question, tôi thấy mình không hiểu câu trả lời của riêng mình.Tại sao (1 trong [1.0] == True) đánh giá sai?

Tôi thực sự không hiểu cách phân tích cú pháp này. Tại sao ví dụ thứ hai trả về False?

>>> 1 in [1,0]    # This is expected 
True 
>>> 1 in [1,0] == True  # This is strange 
False 
>>> (1 in [1,0]) == True # This is what I wanted it to be 
True 
>>> 1 in ([1,0] == True) # But it's not just a precedence issue! 
          # It did not raise an exception on the second example. 

Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    1 in ([1,0] == True) 
TypeError: argument of type 'bool' is not iterable 

Cảm ơn bạn đã được trợ giúp. Tôi nghĩ rằng tôi phải thiếu một cái gì đó thực sự rõ ràng.


Tôi nghĩ rằng đây là một cách tinh tế khác nhau cho bản sao đã được liên kết:

Why does the expression 0 < 0 == 0 return False in Python?.

Cả hai câu hỏi đều liên quan đến hiểu biết của con người về biểu thức. Dường như có hai cách để suy nghĩ về biểu hiện. Tất nhiên là không chính xác, nhưng trong ví dụ của tôi, giải thích cuối cùng là không thể.

Nhìn vào 0 < 0 == 0 bạn có thể tưởng tượng mỗi nửa được đánh giá và làm cho ý nghĩa như là một biểu:

>>> (0 < 0) == 0 
True 
>>> 0 < (0 == 0) 
True 

Vì vậy, các liên kết câu trả lời tại sao điều này đánh giá False:

>>> 0 < 0 == 0 
False 

Nhưng với ví dụ 1 in ([1,0] == True) doesn của tôi không có ý nghĩa như một biểu thức, do đó, thay vì có hai (thừa nhận sai) có thể giải thích, chỉ có một cách có thể:

>>> (1 in [1,0]) == True 
+1

Ưu tiên toán tử ... '==' liên kết chặt chẽ hơn 'in', vì vậy' [1.0] == True' được đánh giá trước, sau đó kết quả của việc đó được đưa vào '1 trong other_result'. –

+0

Tôi đã xóa thẻ Python-2.7, vì Python 3.2 hoạt động theo cùng một cách. – lvc

+1

@Marc B: Không giải thích biểu thức thứ hai –

Trả lời

180

Python thực sự áp dụng chuỗi toán tử so sánh ở đây. Biểu thức được dịch sang

(1 in [1, 0]) and ([1, 0] == True) 

rõ ràng là False.

này cũng xảy ra cho các biểu thức như

a < b < c 

mà dịch để

(a < b) and (b < c) 

(mà không đánh giá b hai lần).

Xem Python language documentation để biết thêm chi tiết.

+34

Bằng chứng bổ sung cho điều này, '1 trong [1, 0] == [1, 0]' đánh giá là 'True'. –

+0

'không phải 1 trong [1,0] == True' ... – ChessMaster

+8

Tôi đã nghĩ về điều này như một cơn giông ngôn ngữ. Tôi đã có thể ưa thích rằng toán tử 'in' có ưu tiên cao hơn so với các toán tử so sánh khác và nó không phải là chuỗi. Nhưng có lẽ tôi đang thiếu một trường hợp sử dụng. –

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