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

คัดลอก - การดำเนินการคัดลอกแบบตื้นและลึกใน Python


ใน Python ตัวแปรเป็นเพียงการอ้างอิงถึงวัตถุ ดังนั้นเมื่อถูกกำหนดให้กับตัวแปรอื่น จะไม่คัดลอกอ็อบเจ็กต์ แต่จะทำหน้าที่เป็นการอ้างอิงอื่นไปยังอ็อบเจกต์เดียวกัน สามารถตรวจสอบได้โดยใช้ฟังก์ชัน id()

>>> L1 =[1,2,3]>>> L2 =L1>>> id(L1), id(L2)(2165544063496, 2165544063496)

ผลลัพธ์ของรหัสข้างต้นแสดงว่า id() สำหรับวัตถุทั้งสองรายการเหมือนกัน ซึ่งหมายความว่าทั้งคู่อ้างถึงวัตถุเดียวกัน L2 ถูกกล่าวว่าเป็นสำเนาตื้นของ L1 เนื่องจากทั้งคู่อ้างถึงวัตถุเดียวกัน การเปลี่ยนแปลงใดๆ ในสิ่งใดสิ่งหนึ่งจะสะท้อนให้เห็นในวัตถุอื่น

<ก่อนหน้า>>>> L1 =[1,2,3]>>> L2 =L1>>> L2[1] =100>>> L1,L2([1, 100, 3], [1, 100, 3])

ในตัวอย่างข้างต้น รายการที่ดัชนีหมายเลข 1 ของ L2 มีการเปลี่ยนแปลง เราเห็นการเปลี่ยนแปลงนี้ปรากฏในทั้งคู่

เมื่อมีการสร้างอ็อบเจ็กต์ใหม่ทั้งหมดด้วยการดำเนินการคัดลอก สำเนาของออบเจ็กต์ที่ซ้อนอยู่จะถูกเพิ่มเข้าไปซ้ำๆ ด้วย การคัดลอกจะเรียกว่า Deep Copy

โมดูลคัดลอกของไลบรารีมาตรฐาน Python มี 2 วิธี:

  • copy.copy() – สร้างสำเนาตื้น
  • copy.deepcopy() – สร้างสำเนาลึก

สำเนาตื้นจะสร้างวัตถุใหม่และเก็บการอ้างอิงขององค์ประกอบดั้งเดิมแต่ไม่สร้างสำเนาของวัตถุที่ซ้อนกัน มันแค่คัดลอกการอ้างอิงของวัตถุที่ซ้อนกัน ส่งผลให้กระบวนการคัดลอกไม่เกิดซ้ำ

<ก่อน>>>> คัดลอกนำเข้า>>> L1 =[[1,2,3], [4,5,6]]>>> L2 =copy.copy(L1)>>> L1,L2([[ 1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])>>> L2.append([10,10,10])>>> L1,L2([[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6], [10, 10, 10]])

ที่นี่ L1 เป็นรายการที่ซ้อนกันและ L2 เป็นสำเนาที่ตื้น แม้ว่าการอ้างอิงไปยังอ็อบเจ็กต์รายการพาเรนต์จะถูกคัดลอกไปยัง L2 แต่อิลิเมนต์ที่ซ้อนกันจะไม่ถูกคัดลอก ดังนั้น เมื่อเราผนวกรายการอื่นเข้ากับ L2 จะไม่แสดงใน L1

อย่างไรก็ตาม หากเราพยายามแก้ไของค์ประกอบในองค์ประกอบลูก จะเห็นผลลัพธ์ในทั้งสองรายการ

<ก่อนหน้า>>>> L1 =[[1,2,3], [4,5,6]]>>> L2 =copy.copy(L1)>>> L1,L2([[1, 2, 3 ], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])>>> L2[1][0] =100>>> L1,L2([[[ 1, 2, 3], [100, 5, 6]], [[1, 2, 3], [100, 5, 6]])

อย่างไรก็ตาม การคัดลอกแบบลึกจะสร้างออบเจ็กต์ใหม่และเพิ่มสำเนาของออบเจ็กต์ที่ซ้อนกันซ้ำๆ ด้วย ซึ่งแสดงอยู่ในองค์ประกอบดั้งเดิม

ในตัวอย่างต่อไปนี้ L2 เป็นสำเนาลึกของ L2 ตอนนี้ถ้าเราเปลี่ยนองค์ประกอบใด ๆ ของรายการภายใน สิ่งนี้จะไม่ปรากฏในรายการอื่น

<ก่อนหน้า>>>> L1 =[[1,2,3], [4,5,6]]>>> L2 =copy.deepcopy(L1)>>> L1,L2([[1, 2, 3 ], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]])>>> L2[1][0] =100>>> L1,L2([[[ 1, 2, 3], [4, 5, 6]], [[1, 2, 3], [100, 5, 6]])

ผลลัพธ์ของการทำสำเนาแบบลึกจึงได้รับการยืนยันโดยผลลัพธ์