เหตุใดจึงอนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายในรายการ


136

ฉันสงสัยว่าทำไมใน Python เครื่องหมายจุลภาคต่อท้ายในรายการจึงเป็นไวยากรณ์ที่ถูกต้องและดูเหมือนว่า Python จะเพิกเฉยต่อมัน:

>>> ['a','b',]
['a', 'b']

มันสมเหตุสมผลแล้วเมื่อมันเป็นทูเพิล('a')และ('a',)เป็นสองสิ่งที่แตกต่างกัน แต่อยู่ในรายการ?



7
อนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายในรายการใน C, C ++, Java, JavaScript และอื่น ๆ อีกด้วย
Nayuki

คำตอบ:


224

ข้อดีหลัก ๆ คือทำให้รายการหลายบรรทัดแก้ไขได้ง่ายขึ้นและช่วยลดความยุ่งเหยิงในความแตกต่าง

การเปลี่ยนแปลง:

s = ['manny',
     'mo',
     'jack',
]

ถึง:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

เกี่ยวข้องกับการเปลี่ยนแปลงเพียงบรรทัดเดียวในความแตกต่าง:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

สิ่งนี้จะทำให้ความแตกต่างของหลายบรรทัดที่สับสนมากขึ้นเมื่อไม่ใส่เครื่องหมายจุลภาคต่อท้าย:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

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

นอกจากนี้ยังช่วยลดความเสี่ยงในการทำสิ่งนี้:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

และทริกเกอร์การเชื่อมต่อลิเทอรัลสตริงโดยปริยายซึ่งสร้างขึ้นs = ['manny', 'mo', 'jackroger']แทนผลลัพธ์ที่ต้องการ


6
สิ่งนี้ทำให้เกิดความรู้สึก (ส่วนใหญ่) แต่ฉันจะแปลกใจมากถ้าตัวแยกวิเคราะห์ของภาษาได้รับการออกแบบมาเพื่อให้ความแตกต่างง่ายขึ้น
Burhan Khalid

94
@ BurhanKhalid: นักออกแบบภาษาเป็นโปรแกรมเมอร์และโปรแกรมเมอร์ก็ทำหลายอย่างเพื่อให้ชีวิตง่ายขึ้น
Greg Hewgill

10
@ Burhan ถ้าคุณไม่เชื่อคำอธิบายนั้นการนิยามไวยากรณ์ด้วยวิธีนั้นก็ง่ายกว่าเช่นกัน? ;) เปรียบเทียบList = "[" {Item ","} "]".กับList = "[" ({Item","}Item|)"]".
Voo

23
นอกจากนี้ยังช่วยให้โปรแกรมอื่น ๆ สร้างโค้ดอัตโนมัติได้ง่ายขึ้น - การพิมพ์"\"item\","สำหรับแต่ละรายการนั้นง่ายกว่าการพิมพ์"\"item\""สำหรับแต่ละรายการตามด้วย","สำหรับรายการทั้งหมดยกเว้นรายการสุดท้าย
Adam Rosenfield

9
@Voo ฉันก็คิดเหมือนกัน แต่ต้องกำหนดไวยากรณ์หลังอยู่ดีเพราะมันยังคงเป็นรายการ Python ที่ถูกต้อง
Alexander Suraphel

34

เป็นรูปแบบการสังเคราะห์ทั่วไปที่อนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายในอาร์เรย์ภาษาเช่น C และ Java อนุญาตและ Python ดูเหมือนจะใช้หลักการนี้สำหรับโครงสร้างข้อมูลรายการ มีประโยชน์อย่างยิ่งเมื่อสร้างโค้ดสำหรับการเติมรายการ: เพียงสร้างลำดับขององค์ประกอบและเครื่องหมายจุลภาคโดยไม่จำเป็นต้องพิจารณารายการสุดท้ายเป็นกรณีพิเศษที่ไม่ควรมีเครื่องหมายจุลภาคต่อท้าย


30

ช่วยกำจัดจุดบกพร่องบางประเภท บางครั้งการเขียนรายการในหลายบรรทัดก็ชัดเจนกว่า แต่ในการบำรุงรักษาในภายหลังคุณอาจต้องการจัดเรียงรายการใหม่

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

แต่ถ้าคุณอนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายคุณสามารถจัดเรียงบรรทัดใหม่ได้อย่างง่ายดายโดยไม่ทำให้เกิดข้อผิดพลาด


1
นี่เป็นวิธีที่เรียบร้อย แต่คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการรอเครื่องหมายจุลภาค ฉันทำอย่างนั้นตลอดเวลาเมื่อเขียน SQL
Burhan Khalid

38
แม้ว่าคุณจะใส่เครื่องหมายจุลภาคให้กับแต่ละองค์ประกอบ แต่คุณยังคงต้องเว้นเครื่องหมายจุลภาคในองค์ประกอบแรก
Greg Hewgill

เศษเหล็กน่าจะจับสิ่งนี้ได้ไม่ใช่เหรอ?
viki.omega9

6

ทูเปิลแตกต่างกันเนื่องจาก('a')ขยายโดยใช้ความต่อเนื่องโดยนัยและ()s เป็นตัวดำเนินการลำดับความสำคัญในขณะที่('a',)หมายถึงทูเพิลที่มีความยาว 1

ตัวอย่างเดิมของคุณน่าจะเป็น tuple('a')


('a'),เป็นสตริง แต่ประเด็นของฉันคือเครื่องหมายจุลภาคต่อท้ายในทูมีความสำคัญ แต่ในรายการดูเหมือนว่า Python ยังไม่ยอมรับ
Burhan Khalid

1
ในทั้งสองกรณีจะถูกทิ้งอย่างเงียบ ๆ แต่ในทูเพิลจำเป็นต้องแยกความแตกต่างจากสตริงในวงเล็บ
richo

tuple('a')อาจเป็นตัวอย่างที่ไม่ดีเพราะโดยทั่วไปtuple(x)และ(x,)ไม่ใช่สิ่งเดียวกัน tuple('ab') != ('ab',). tuple('a') == ('a',)เพียงเพราะ'a'เป็นสตริงที่มีความยาว 1
chepner

จาก REPL: >>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True
Seraphya

1

เหตุผลหลักคือการทำให้ความแตกต่างซับซ้อนน้อยลง ตัวอย่างเช่นคุณมีรายการ:

list = [
    'a',
    'b',
    'c'
]

และคุณต้องการเพิ่มองค์ประกอบอื่นเข้าไป จากนั้นคุณจะต้องทำสิ่งนี้:

list = [
    'a',
    'b',
    'c',
    'd'
]

ดังนั้นความแตกต่างจะแสดงให้เห็นว่ามีการเปลี่ยนแปลงสองบรรทัดโดยเพิ่ม '' 'ในบรรทัดแรกด้วย' c 'และเพิ่ม' d 'ที่บรรทัดสุดท้าย

ดังนั้น python จึงอนุญาตให้ต่อท้าย ',' ในองค์ประกอบสุดท้ายของรายการเพื่อป้องกันความแตกต่างเพิ่มเติมซึ่งอาจทำให้เกิดความสับสน

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