ในบทนี้ เราจะเห็นว่าเกิดอะไรขึ้นเมื่อเราอัปเดตค่าในทูเพิล ซึ่งแท้จริงแล้วไม่เปลี่ยนรูป เราจะสามารถรวมค่าใหม่กับค่าเก่าได้ แต่นั่นทำให้เกิดข้อผิดพลาด เราสามารถศึกษา bytecode ของข้อผิดพลาดและเข้าใจมากขึ้นว่ากฎสำหรับ tuple ทำงานอย่างไร
ขั้นแรก เรากำหนด tuple แล้วออกคำสั่งเพื่ออัปเดตองค์ประกอบสุดท้ายดังที่แสดงด้านล่าง
ตัวอย่าง
>>> tupl = (5,7,9,[1,4]) >>> tupl[3] += [6,8]
ผลลัพธ์
การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -
Traceback (most recent call last): File "", line 1, in TypeError: 'tuple' object does not support item assignment >>> tupl (5, 7, 9, [1, 4, 6, 8])
ตอนนี้เราจะศึกษาโค้ดไบต์ของวิธีการข้างต้น เราใส่โค้ดลงในฟังก์ชันและใช้วิธี dis เพื่อแสดงโค้ดไบต์ เราได้รับข้อผิดพลาดเดียวกัน แต่มีรายละเอียดเพิ่มเติม
ตัวอย่าง
def immut_function(): tupl = (5,7,9,[1,4]) tupl[3] += [6,8] immut_function()
ผลลัพธ์
การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -
TypeError Traceback (most recent call last) in () 2 tupl = (5,7,9,[1,4]) 3 tupl[3] += [6,8] ----> 4 immut_function() in immut_function() 1 def immut_function(): 2 tupl = (5,7,9,[1,4]) ----> 3 tupl[3] += [6,8] 4 immut_function() TypeError: 'tuple' object does not support item assignment
ต่อไปเราจะแสดง bytecode ของฟังก์ชันด้านบนเพื่อดูรายละเอียดของการกำหนด tuple และข้อผิดพลาด
ตัวอย่าง
import dis dis.dis(immut_function)
ผลลัพธ์
การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -
2 0 LOAD_CONST 1 (5) 3 LOAD_CONST 2 (7) 6 LOAD_CONST 3 (9) 9 LOAD_CONST 4 (1) 12 LOAD_CONST 5 (4) 15 BUILD_LIST 2 18 BUILD_TUPLE 4 21 STORE_FAST 0 (tupl) 3 24 LOAD_FAST 0 (tupl) 27 LOAD_CONST 6 (3) 30 DUP_TOPX 2 33 BINARY_SUBSCR 34 LOAD_CONST 7 (6) 37 LOAD_CONST 8 (8) 40 BUILD_LIST 2 43 INPLACE_ADD 44 ROT_THREE 45 STORE_SUBSCR 46 LOAD_CONST 0 (None) 49 RETURN_VALUE
ข้อสรุปคือไม่ต้องใส่องค์ประกอบที่เปลี่ยนแปลงได้ลงในทูเพิล แม้ว่าการมอบหมายจะเป็นไปได้ แต่ก็มีข้อยกเว้น ดังที่แสดงในขั้นตอนที่มีค่า 46 การกำหนดจะล้มเหลวเนื่องจากทูเพิลเป็นอ็อบเจกต์ที่ไม่เปลี่ยนรูป