Tại sao (1 trong [1,0] == True) đánh giá thành Sai?


153

Khi tôi đang xem câu trả lời cho câu hỏi này , tôi thấy tôi không hiểu câu trả lời của chính mình.

Tôi thực sự không hiểu làm thế nào điều này được phân tích cú pháp. Tại sao ví dụ thứ hai trả về Sai?

>>> 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 vì bất kì sự 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 điều này là khác biệt tinh tế với các bản sao được liên kết:

Tại sao biểu thức 0 <0 == 0 trả về Sai trong Python? .

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

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

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

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

>>> 0 < 0 == 0
False

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

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

1
Ưu tiên toán tử ... các ==liên kết chặt chẽ hơn in, do đó, [1,0] == Trueđược đánh giá đầu tiên, sau đó kết quả của nó được đưa vào 1 in other_result.
Marc B

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
Scott Hunter

32
@MarcB, câu hỏi bao gồm một bài kiểm tra sử dụng dấu ngoặc đơn để từ chối giải thích đó.
Đánh dấu tiền chuộc

Câu trả lời:


194

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

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

mà rõ ràng False.

Điều này cũng xảy ra đối với các biểu thức như

a < b < c

dịch sang

(a < b) and (b < c)

(không đánh giá bhai lần).

Xem tài liệu ngôn ngữ Python để biết thêm chi tiết.


40
Bằng chứng bổ sung cho điều này, 1 in [1, 0] == [1, 0]đánh giá để True.
Andrew Clark

9
Tôi từ lâu đã nghĩ đây là một ngôn ngữ. Tôi muốn các intoán tử có quyền ưu tiên cao hơn 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.
Steven Rumbalski

3
Bắt tốt, tôi thậm chí không nghĩ về điều đó. Không có ý nghĩa gì khi cho phép xâu chuỗi in- sau tất cả x < y < zcó ý nghĩa, nhưng không quá nhiều vớix in y in z
BlueRaja - Danny Pflughoeft

7
@Sven Hữu ích: có thể. Đọc được: chắc chắn là không. Python có ý định mô phỏng kiểu chữ toán học phổ biến với quy ước này, nhưng khi được sử dụng với inđiều này đơn giản là không còn trường hợp này và làm cho nó khá phản trực giác.
Konrad Rudolph

6
@KonradRudolph: Tôi đã thấy nghĩ như "1 ≤ x ∈" trong các văn bản toán học hơn một lần, nhưng về cơ bản tôi đồng ý với bạn.
Sven Marnach
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.