รายการที่ต้องดำเนินการคือ: การจัดการกับรายการที่ตื้น (ไม่มี sub_lists เพียงองค์ประกอบเดียว) โดยใช้ "การมอบหมายปกติ" เพิ่ม "ผลข้างเคียง" เมื่อคุณสร้างรายการที่ตื้นแล้วคุณสร้างสำเนาของรายการนี้โดยใช้ "การมอบหมายปกติ" . "ผลข้างเคียง" นี้คือเมื่อคุณเปลี่ยนองค์ประกอบใด ๆ ของรายการคัดลอกที่สร้างขึ้นเพราะมันจะเปลี่ยนองค์ประกอบเดียวกันของรายการต้นฉบับโดยอัตโนมัติ นั่นคือเมื่อcopy
มีประโยชน์เพราะจะไม่เปลี่ยนองค์ประกอบรายการดั้งเดิมเมื่อเปลี่ยนองค์ประกอบการคัดลอก
ในทางกลับกันcopy
จะมี "ผลข้างเคียง" เช่นกันเมื่อคุณมีรายการที่มีรายการอยู่ในนั้น (sub_lists) และdeepcopy
แก้ไขได้ ตัวอย่างเช่นถ้าคุณสร้างรายการใหญ่ที่มีรายการซ้อนอยู่ในนั้น (sub_lists) และคุณสร้างสำเนาของรายการใหญ่นี้ (รายการเดิม) "ผลข้างเคียง" จะเกิดขึ้นเมื่อคุณแก้ไขรายการย่อยของรายการคัดลอกซึ่งจะแก้ไขรายการย่อยของรายการใหญ่โดยอัตโนมัติ บางครั้ง (ในบางโครงการ) คุณต้องการเก็บรายการขนาดใหญ่ (รายการดั้งเดิมของคุณ) ตามที่ไม่มีการแก้ไขและสิ่งที่คุณต้องการคือการทำสำเนาองค์ประกอบ (sub_lists) สำหรับวิธีการแก้ปัญหาของคุณคือการใช้deepcopy
ซึ่งจะดูแล "ผลข้างเคียง" นี้และทำสำเนาโดยไม่ต้องแก้ไขเนื้อหาต้นฉบับ
พฤติกรรมที่แตกต่างกันของcopy
และdeep copy
การดำเนินงานที่เกี่ยวข้องกับวัตถุผสมเท่านั้น (เช่น: วัตถุที่มีวัตถุอื่น ๆ เช่นรายการ)
นี่คือความแตกต่างที่แสดงในตัวอย่างรหัสง่ายๆนี้:
เป็นครั้งแรก
มาตรวจสอบcopy
พฤติกรรม (ตื้น) โดยการสร้างรายการต้นฉบับและสำเนาของรายการนี้:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
ตอนนี้เรามาทำการprint
ทดสอบกันแล้วดูว่ารายการต้นฉบับมีคุณสมบัติอย่างไรเมื่อเทียบกับรายการคัดลอก:
original_list และ copy_list มีที่อยู่ต่างกัน
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
องค์ประกอบของ original_list และ copy_list มีที่อยู่เดียวกัน
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements ของ original_list และ copy_list มีที่อยู่เดียวกัน
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x1faef08 0x1faef08
การปรับเปลี่ยนองค์ประกอบ original_list ไม่ได้แก้ไของค์ประกอบ copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
การแก้ไของค์ประกอบ copy_list ไม่ได้แก้ไของค์ประกอบ original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
การแก้ไข original_list sub_elements แก้ไขโดยอัตโนมัติ copy_list sub_elements
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 7]
การแก้ไข copy_list sub_elements โดยอัตโนมัติแก้ไข original_list sub_elements
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 7]
ที่สอง
มาตรวจสอบdeepcopy
พฤติกรรมโดยทำในสิ่งเดียวกันกับที่เราทำcopy
(สร้างรายการต้นฉบับและสำเนาของรายการนี้):
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.copy(original_list)
ตอนนี้เรามาทำการprint
ทดสอบกันแล้วดูว่ารายการต้นฉบับมีคุณสมบัติอย่างไรเมื่อเทียบกับรายการคัดลอก:
import copy
original_list = [1, 2, 3, 4, 5, ['a', 'b']]
copy_list = copy.deepcopy(original_list)
original_list และ copy_list มีที่อยู่ต่างกัน
print(hex(id(original_list)), hex(id(copy_list))) # 0x1fb3030 0x1fb3328
องค์ประกอบของ original_list และ copy_list มีที่อยู่เดียวกัน
print(hex(id(original_list[1])), hex(id(copy_list[1]))) # 0x537ed440 0x537ed440
sub_elements ของ original_list และ copy_list มีที่อยู่ต่างกัน
print(hex(id(original_list[5])), hex(id(copy_list[5]))) # 0x24eef08 0x24f3300
การปรับเปลี่ยนองค์ประกอบ original_list ไม่ได้แก้ไของค์ประกอบ copy_list
original_list.append(6)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b']]
การแก้ไของค์ประกอบ copy_list ไม่ได้แก้ไของค์ประกอบ original_list
copy_list.append(7)
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
การแก้ไข original_list sub_elements ไม่ได้แก้ไข copy_list sub_elements
original_list[5].append('c')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b'], 7]
การแก้ไข copy_list sub_elements ไม่ได้แก้ไข original_list sub_elements
copy_list[5].append('d')
print("original_list is:", original_list) # original_list is: [1, 2, 3, 4, 5, ['a', 'b', 'c', 'd'], 6]
print("copy_list is:", copy_list) # copy_list is: [1, 2, 3, 4, 5, ['a', 'b', 'd'], 7]