Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

A +=B ปริศนาการมอบหมายใน Python


ในบทนี้ เราจะเห็นว่าเกิดอะไรขึ้นเมื่อเราอัปเดตค่าในทูเพิล ซึ่งแท้จริงแล้วไม่เปลี่ยนรูป เราจะสามารถรวมค่าใหม่กับค่าเก่าได้ แต่นั่นทำให้เกิดข้อผิดพลาด เราสามารถศึกษา 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 การกำหนดจะล้มเหลวเนื่องจากทูเพิลเป็นอ็อบเจกต์ที่ไม่เปลี่ยนรูป