"การเติม" ผู้ประกอบการที่ได้รับมอบหมายเช่น+=
ถูกนำมาใช้ในหลาม 2.0 ซึ่งได้รับการปล่อยตัวในเดือนตุลาคม 2000 การออกแบบและเหตุผลที่อธิบายไว้ในPEP 203 หนึ่งในเป้าหมายที่ประกาศไว้ของผู้ประกอบการเหล่านี้คือการสนับสนุนการดำเนินงานในสถานที่ การเขียน
a = [1, 2, 3]
a += [4, 5, 6]
ควรจะปรับปรุงรายการในสถานที่a
สิ่งนี้สำคัญหากมีการอ้างอิงอื่น ๆ ในรายการa
เช่นเมื่อa
ได้รับเป็นอาร์กิวเมนต์ของฟังก์ชัน
อย่างไรก็ตามการดำเนินการไม่สามารถเกิดขึ้นได้เสมอเนื่องจาก Python หลายประเภทรวมถึงจำนวนเต็มและสตริงไม่สามารถเปลี่ยนแปลงได้ดังนั้นi += 1
สำหรับจำนวนเต็มi
จึงไม่สามารถใช้งานได้
โดยสรุปผู้ประกอบการที่ได้รับมอบหมายเพิ่มเติมควรจะทำงานในสถานที่เมื่อเป็นไปได้และสร้างวัตถุใหม่เป็นอย่างอื่น เพื่ออำนวยความสะดวกในเป้าหมายการออกแบบเหล่านี้นิพจน์x += y
ถูกระบุให้ทำงานดังนี้:
- หาก
x.__iadd__
ถูกกำหนดx.__iadd__(y)
จะถูกประเมิน
- มิฉะนั้นหาก
x.__add__
มีการใช้งานx.__add__(y)
จะถูกประเมิน
- มิฉะนั้นหาก
y.__radd__
มีการใช้งานy.__radd__(x)
จะถูกประเมิน
- มิฉะนั้นยกข้อผิดพลาด
ผลลัพธ์แรกที่ได้จากกระบวนการนี้จะถูกกำหนดกลับไปที่x
(เว้นแต่ว่าผลลัพธ์จะเป็นNotImplemented
ซิงเกิลซึ่งในกรณีนี้การค้นหาจะดำเนินการต่อในขั้นตอนถัดไป)
__iadd__()
กระบวนการนี้จะช่วยให้การปรับเปลี่ยนประเภทที่สนับสนุนในสถานที่ที่จะใช้ ประเภทที่ไม่สนับสนุนในสถานที่การปรับเปลี่ยนไม่จำเป็นต้องเพิ่มวิธีมายากลใหม่ ๆ x = x + y
ตั้งแต่ปีงูใหญ่จะตกอยู่โดยอัตโนมัติกลับไปเป็นหลัก
ดังนั้นในที่สุดเรามาถึงคำถามที่แท้จริงของคุณ - ทำไมคุณสามารถเพิ่ม tuple ลงในรายการด้วยตัวดำเนินการมอบหมายเพิ่มเติม จากความทรงจำประวัติความเป็นมาของมันก็เป็นแบบนี้: list.__iadd__()
วิธีการนี้ถูกใช้เพื่อเรียกlist.extend()
วิธีที่มีอยู่แล้วใน Python 2.0 เมื่อมีการแนะนำตัววนซ้ำใน Python 2.1 list.extend()
วิธีนี้ได้รับการปรับปรุงเพื่อยอมรับตัววนซ้ำโดยพลการ ผลลัพธ์สุดท้ายของการเปลี่ยนแปลงเหล่านี้คือการmy_list += my_tuple
ทำงานที่เริ่มต้นจาก Python 2.1 อย่างไรก็ตามlist.__add__()
วิธีนี้ไม่ควรสนับสนุนการทำซ้ำโดยพลการในฐานะที่เป็นอาร์กิวเมนต์ทางด้านขวา - ซึ่งถือว่าไม่เหมาะสมกับภาษาที่พิมพ์
โดยส่วนตัวแล้วฉันคิดว่าการใช้งานตัวดำเนินการเติมสิ้นสุดลงด้วยความซับซ้อนเกินไปใน Python มันมีผลข้างเคียงที่น่าแปลกใจมากมายเช่นรหัสนี้:
t = ([42], [43])
t[0] += [44]
บรรทัดที่สองยกTypeError: 'tuple' object does not support item assignment
, แต่การดำเนินการจะดำเนินการประสบความสำเร็จอยู่แล้ว - t
จะเป็น([42, 44], [43])
หลังจากรันบรรทัดที่ก่อให้เกิดข้อผิดพลาด