ฉันสงสัยว่าทำไมใน Python เครื่องหมายจุลภาคต่อท้ายในรายการจึงเป็นไวยากรณ์ที่ถูกต้องและดูเหมือนว่า Python จะเพิกเฉยต่อมัน:
>>> ['a','b',]
['a', 'b']
มันสมเหตุสมผลแล้วเมื่อมันเป็นทูเพิล('a')
และ('a',)
เป็นสองสิ่งที่แตกต่างกัน แต่อยู่ในรายการ?
ฉันสงสัยว่าทำไมใน Python เครื่องหมายจุลภาคต่อท้ายในรายการจึงเป็นไวยากรณ์ที่ถูกต้องและดูเหมือนว่า Python จะเพิกเฉยต่อมัน:
>>> ['a','b',]
['a', 'b']
มันสมเหตุสมผลแล้วเมื่อมันเป็นทูเพิล('a')
และ('a',)
เป็นสองสิ่งที่แตกต่างกัน แต่อยู่ในรายการ?
คำตอบ:
ข้อดีหลัก ๆ คือทำให้รายการหลายบรรทัดแก้ไขได้ง่ายขึ้นและช่วยลดความยุ่งเหยิงในความแตกต่าง
การเปลี่ยนแปลง:
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']
แทนผลลัพธ์ที่ต้องการ
List = "[" {Item ","} "]".
กับList = "[" ({Item","}Item|)"]".
"\"item\","
สำหรับแต่ละรายการนั้นง่ายกว่าการพิมพ์"\"item\""
สำหรับแต่ละรายการตามด้วย","
สำหรับรายการทั้งหมดยกเว้นรายการสุดท้าย
เป็นรูปแบบการสังเคราะห์ทั่วไปที่อนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายในอาร์เรย์ภาษาเช่น C และ Java อนุญาตและ Python ดูเหมือนจะใช้หลักการนี้สำหรับโครงสร้างข้อมูลรายการ มีประโยชน์อย่างยิ่งเมื่อสร้างโค้ดสำหรับการเติมรายการ: เพียงสร้างลำดับขององค์ประกอบและเครื่องหมายจุลภาคโดยไม่จำเป็นต้องพิจารณารายการสุดท้ายเป็นกรณีพิเศษที่ไม่ควรมีเครื่องหมายจุลภาคต่อท้าย
ช่วยกำจัดจุดบกพร่องบางประเภท บางครั้งการเขียนรายการในหลายบรรทัดก็ชัดเจนกว่า แต่ในการบำรุงรักษาในภายหลังคุณอาจต้องการจัดเรียงรายการใหม่
l1 = [
1,
2,
3,
4,
5
]
# Now you want to rearrange
l1 = [
1,
2,
3,
5
4,
]
# Now you have an error
แต่ถ้าคุณอนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายคุณสามารถจัดเรียงบรรทัดใหม่ได้อย่างง่ายดายโดยไม่ทำให้เกิดข้อผิดพลาด
ทูเปิลแตกต่างกันเนื่องจาก('a')
ขยายโดยใช้ความต่อเนื่องโดยนัยและ()
s เป็นตัวดำเนินการลำดับความสำคัญในขณะที่('a',)
หมายถึงทูเพิลที่มีความยาว 1
ตัวอย่างเดิมของคุณน่าจะเป็น tuple('a')
('a'),
เป็นสตริง แต่ประเด็นของฉันคือเครื่องหมายจุลภาคต่อท้ายในทูมีความสำคัญ แต่ในรายการดูเหมือนว่า Python ยังไม่ยอมรับ
tuple('a')
อาจเป็นตัวอย่างที่ไม่ดีเพราะโดยทั่วไปtuple(x)
และ(x,)
ไม่ใช่สิ่งเดียวกัน tuple('ab') != ('ab',)
. tuple('a') == ('a',)
เพียงเพราะ'a'
เป็นสตริงที่มีความยาว 1
>>> ("a",) == ("a")
False >>> ("ab",) == ("ab")
False >>> ("ab", "bc",) == ("ab", "bc")
True
เหตุผลหลักคือการทำให้ความแตกต่างซับซ้อนน้อยลง ตัวอย่างเช่นคุณมีรายการ:
list = [
'a',
'b',
'c'
]
และคุณต้องการเพิ่มองค์ประกอบอื่นเข้าไป จากนั้นคุณจะต้องทำสิ่งนี้:
list = [
'a',
'b',
'c',
'd'
]
ดังนั้นความแตกต่างจะแสดงให้เห็นว่ามีการเปลี่ยนแปลงสองบรรทัดโดยเพิ่ม '' 'ในบรรทัดแรกด้วย' c 'และเพิ่ม' d 'ที่บรรทัดสุดท้าย
ดังนั้น python จึงอนุญาตให้ต่อท้าย ',' ในองค์ประกอบสุดท้ายของรายการเพื่อป้องกันความแตกต่างเพิ่มเติมซึ่งอาจทำให้เกิดความสับสน