ความหมายของ“ (1,) == 1 ใน Python คืออะไร?


119

ฉันกำลังทดสอบโครงสร้างทูเพิลและฉันพบว่ามันแปลกเมื่อฉันใช้ตัว==ดำเนินการเช่น:

>>>  (1,) == 1,
Out: (False,)

เมื่อฉันกำหนดสองนิพจน์นี้ให้กับตัวแปรผลลัพธ์จะเป็นจริง:

>>> a = (1,)
>>> b = 1,
>>> a==b
Out: True

คำถามนี้แตกต่างจากกฎไวยากรณ์ของคอมมาของPython tupleในมุมมองของฉัน ฉันถามกลุ่มของนิพจน์ระหว่าง==ตัวดำเนินการ


16
เมื่อดูคำถามก่อนหน้านี้โดย OP เมื่อ 2 ชั่วโมงที่แล้วดูเหมือนว่าจะยอดเยี่ยม (หรือแปลก) ที่การจัดกรอบคำถามให้แตกต่างกันสามารถนำไปสู่ผลลัพธ์ที่แตกต่างกันได้อย่างไร (และการยอมรับในหมู่ชุมชน)
AKS

24
@AKS คำถามเหล่านี้ต่างกัน
kmaork

7
@AKS แม้ว่าคำถามจะแตกต่างกันเล็กน้อยที่นี่ฉันเห็นด้วยอย่างยิ่งกับประเด็นของคุณ เอฟเฟกต์ฝูงหรือที่เรียกว่า HNQ
บ้า

5
@PythonNewHand อันที่จริงมันเป็นที่ยอมรับอย่างสมบูรณ์ นั่นเป็นเหตุผลที่ฉันเสริมว่าการกำหนดกรอบคำถามให้แตกต่างออกไป
AKS

3
@CiroSantilli 巴拿馬文件六四事件法轮功คุณคิดยังไง? ฉันอ่านคำตอบเหล่านั้นและไม่เห็นอะไรที่ดูเหมือนจะครอบคลุมสถานการณ์นี้โดยเฉพาะ
Dan Getz

คำตอบ:


88

คำตอบอื่น ๆ ได้แสดงให้เห็นแล้วว่าพฤติกรรมของคุณเป็นเพราะผู้ประกอบการมีความสำคัญเป็นเอกสารที่นี่

ฉันจะแสดงวิธีค้นหาคำตอบด้วยตัวคุณเองในครั้งต่อไปที่คุณมีคำถามคล้าย ๆ กันนี้ คุณสามารถแยกโครงสร้างวิธีการแยกวิเคราะห์นิพจน์โดยใช้astโมดูล:

>>> import ast
>>> source_code = '(1,) == 1,'
>>> print(ast.dump(ast.parse(source_code), annotate_fields=False))
Module([Expr(Tuple([Compare(Tuple([Num(1)], Load()), [Eq()], [Num(1)])], Load()))])

จากสิ่งนี้เราจะเห็นว่ารหัสได้รับการแยกวิเคราะห์ตามที่ Tim Peters อธิบาย :

Module([Expr(
    Tuple([
        Compare(
            Tuple([Num(1)], Load()), 
            [Eq()], 
            [Num(1)]
        )
    ], Load())
)])

1
เครื่องมือที่มีประโยชน์อีกอย่างคือdis- ในกรณีนี้คุณจะเห็นสองLOAD_CONSTค่าที่มีค่าต่างกัน ( (1,)และ1) และBUILD_TUPLEรหัส opp
mgilson

153

นี่เป็นเพียงความสำคัญของตัวดำเนินการ ครั้งแรกของคุณ

(1,) == 1,

กลุ่มดังนี้:

((1,) == 1),

ดังนั้นสร้างทูเพิลที่มีองค์ประกอบเดียวจากผลของการเปรียบเทียบทูเพิลหนึ่งองค์ประกอบ1,กับจำนวนเต็ม1เพื่อความเท่าเทียมกันพวกมันไม่เท่ากันดังนั้นคุณจะได้ 1 ทูเพิลFalse,สำหรับผลลัพธ์


61
ไม่จริง แต่ 1-tuples มีไวยากรณ์แปลก ๆ โดยทั่วไปแล้วคุณต้องการจะไกลประหลาดใจมากขึ้นถ้าเช่น1+2, 2==3, 4*7ทำไม่ได้(1+2), (2==3), (4*7)กลุ่ม ในทางปฏิบัติ 1-tuples แทบจะไม่เคยใช้เลย (นอกจากคำถาม StackOverflow ;-))
Tim Peters

6
บางที "คาดไม่ถึง" อาจเป็นคำที่ดีกว่าที่จะใช้ "แปลก ๆ " ฉันรู้สึกเหมือนกำลังดูภาพวาดหนึ่งในนั้นซึ่งอาจเป็นได้สองอย่างขึ้นอยู่กับมุมมองและโฟกัสของคุณ ผู้ประกอบการไม่เท่าเทียมกันที่มีขนาดใหญ่มากเมื่อเทียบกับจุลภาคมันเป็นเรื่องง่ายที่จะมุ่งเน้นเกี่ยวกับมันและถือว่าผลจะเป็น/True Falseตอนนี้ฉันเข้าใจสิ่งที่เกิดขึ้นแล้วมันชัดเจนและสมเหตุสมผลมาก
skrrgwasme

31
และตอนนี้คุณก็รู้แล้วว่า "Zen of Python" หมายถึงอะไรโดยบอกว่าวิธีหนึ่งที่ชัดเจนในการทำ "อาจไม่ชัดเจนในตอนแรกเว้นแต่คุณเป็นชาวดัตช์" ;-)
Tim Peters

7
มันค่อนข้างสับสนเล็กน้อยเมื่อคุณอ่านเอกสารและเห็นว่าสิ่งที่ทำให้ทูเปิลคือลูกน้ำไม่ใช่วงเล็บ! ดังนั้นในคำนี้เครื่องหมายจุลภาคที่อยู่ทางขวามือจะไม่ถือเป็นส่วนหนึ่งของการทดสอบ แต่ถือเป็นตัวคั่น! พฤติกรรมไม่คาดคิด!
Ikra_5

3
คำแนะนำทั่วไปเกี่ยวกับนิพจน์คือ "เมื่อมีข้อสงสัยให้ใช้วงเล็บ" หลังจากนั้นคุณควรใส่วงเล็บไว้รอบหนึ่งทูเพิลแม้ว่าจะไม่ได้เป็นส่วนหนึ่งของไวยากรณ์ทูเพิลก็ตาม
nigel222

12

เมื่อคุณทำ

>>> (1,) == 1,

มันสร้าง tuple กับผลที่ได้จากการเปรียบเทียบtuple (1,)กับจำนวนเต็มFalseและทำให้กลับมา

แทนเมื่อคุณกำหนดให้กับตัวแปรจะมีการเปรียบเทียบสิ่งสองค่าที่เท่ากัน

คุณสามารถลอง:

>>> x = 1,
>>> x
(1,)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.