"การเติม" ผู้ประกอบการที่ได้รับมอบหมายเช่น+=ถูกนำมาใช้ในหลาม 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])หลังจากรันบรรทัดที่ก่อให้เกิดข้อผิดพลาด