เหตุใด (1 ใน [1,0] == จริง) จึงประเมินเป็นเท็จ


153

เมื่อฉันดูคำตอบสำหรับคำถามนี้ฉันพบว่าฉันไม่เข้าใจคำตอบของฉันเอง

ฉันไม่เข้าใจจริงๆว่ามันถูกแยกวิเคราะห์อย่างไร เหตุใดตัวอย่างที่สองจึงส่งกลับค่าเท็จ

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

ขอบคุณสำหรับความช่วยเหลือ ฉันคิดว่าฉันต้องคิดถึงบางสิ่งที่ชัดเจนจริงๆ


ฉันคิดว่านี่จะแตกต่างอย่างละเอียดกับสำเนาที่ลิงก์:

ทำไมการแสดงออก 0 <0 == 0 คืนเท็จในหลาม? .

คำถามทั้งสองจะทำอย่างไรกับความเข้าใจของมนุษย์ในการแสดงออก ดูเหมือนจะมีสองวิธี (ในใจของฉัน) ในการประเมินการแสดงออก แน่นอนว่าไม่ถูกต้อง แต่ในตัวอย่างของฉันการตีความครั้งสุดท้ายเป็นไปไม่ได้

มองดู0 < 0 == 0คุณสามารถจินตนาการว่าแต่ละครึ่งได้รับการประเมินและมีเหตุผลในการแสดงออก:

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

ดังนั้นลิงก์ตอบว่าทำไมสิ่งนี้ถึงประเมินFalse:

>>> 0 < 0 == 0
False

แต่ด้วยตัวอย่างของฉัน1 in ([1,0] == True)ไม่สมเหตุสมผลในการแสดงออกดังนั้นแทนที่จะมีการตีความที่เป็นไปได้สองแบบ (ยอมรับผิด) ดูเหมือนว่ามีเพียงสิ่งเดียวเท่านั้นที่เป็นไปได้:

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

1
ผู้ประกอบการมีความสำคัญที่ ... ==ผูกแน่นกว่าinเพื่อให้ได้รับการประเมินก่อนแล้วผลจากการที่ได้รับการเลี้ยง[1,0] == True 1 in other_result
Marc B

ฉันลบแท็ก Python-2.7 ออกแล้วเนื่องจาก Python 3.2 ทำงานในลักษณะเดียวกัน
lvc

1
@Marc B: ไม่ได้อธิบายการแสดงออกครั้งที่สอง
Scott Hunter

32
@MarcB คำถามรวมถึงการทดสอบโดยใช้วงเล็บเพื่อพิสูจน์หักล้างการตีความนั้น
Mark Ransom

คำตอบ:


194

Python ใช้การโยงตัวดำเนินการเปรียบเทียบที่นี่จริง ๆ นิพจน์ถูกแปลเป็น

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

Falseซึ่งจะเห็นได้ชัด

สิ่งนี้จะเกิดขึ้นสำหรับการแสดงออกเช่น

a < b < c

ซึ่งแปลว่า

(a < b) and (b < c)

(โดยไม่ต้องประเมินbสองครั้ง)

ดูเอกสารภาษา Pythonสำหรับรายละเอียดเพิ่มเติม


40
หลักฐานเพิ่มเติมสำหรับนี้ประเมิน1 in [1, 0] == [1, 0] True
แอนดรูคลาร์ก

9
ฉันคิดมานานแล้วว่าสิ่งนี้เป็นหูดภาษา ฉันต้องการให้inผู้ปฏิบัติงานมีลำดับความสำคัญสูงกว่าตัวดำเนินการเปรียบเทียบอื่น ๆ และไม่ใช่เครือข่าย แต่บางทีฉันไม่มีกรณีการใช้งาน
Steven Rumbalski

3
จับดีฉันไม่ได้คิดอย่างนั้น มันไม่สมเหตุสมผลนักที่จะยอมให้ผูกมัดin- หลังจากทั้งหมดx < y < zเข้าท่า แต่ไม่มากนักกับx in y in z
BlueRaja - Danny Pflughoeft

7
@ มีประโยชน์: อาจจะ อ่านได้: ไม่แน่นอน Python อ้างว่าเลียนแบบการพิมพ์ทางคณิตศาสตร์ทั่วไปด้วยแบบแผนนี้ แต่เมื่อใช้กับinสิ่งนี้จะไม่เป็นเช่นนั้นอีกต่อไปและทำให้มันค่อนข้างตอบโต้ได้ง่าย
Konrad Rudolph

6
@ KonradRudolph: ฉันเคยเห็นคิดว่า "1 ≤ x ∈ℝ" ในตำราทางคณิตศาสตร์มากกว่าหนึ่งครั้ง แต่โดยทั่วไปฉันเห็นด้วยกับคุณ
Sven Marnach
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.