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

Python - วิธีการ Copy Dictionary (Shallow vs Deep Copy)

ดิกชันนารีเป็นคอลเลกชันที่ไม่มีลำดับ เปลี่ยนแปลงได้ และมีดัชนี เขียนด้วยวงเล็บปีกกา มีคีย์และค่า เมธอด copy() คืนค่า shallow copy ของดิกชันนารี

ตัวอย่างโค้ด

1. ใช้ copy() - Shallow Copy


# สร้างดิกชันนารีต้นฉบับ
original = {1: 'vishesh', 2: 'python'}

# คัดลอกด้วย copy()
new = original.copy()

# ล้างข้อมูลใน new
new.clear()

print('new:', new)
print('original:', original)

2. เปรียบเทียบ = (Reference) vs copy()


# กรณี copy()
original = {1: 'Vishesh', 2: 'python'}
new = original.copy()
new.clear()
print('new:', new)
print('original:', original)

# กรณี = (อ้างอิงเดียวกัน)
original = {1: 'one', 2: 'two'}
new = original  # ไม่ใช่ copy! ชี้ไปที่เดียวกัน
new.clear()
print('new:', new)
print('original:', original)

ผลลัพธ์


# copy()
new: {}
original: {1: 'vishesh', 2: 'python'}

# copy()
new: {}
original: {1: 'Vishesh', 2: 'python'}

# = (reference)
new: {}
original: {}

ความแตกต่างสำคัญ

วิธีประเภทพฤติกรรม
dict.copy()Shallow Copyสร้างดิกชันนารีใหม่ คีย์และค่าชี้ไปที่ออบเจ็กต์เดิม
dict() constructorShallow Copyเหมือน copy()
{**dict} (unpacking)Shallow CopyPython 3.5+
= (Assignment)Referenceชี้ไปที่ออบเจ็กต์เดียวกัน การเปลี่ยนแปลงส่งผลต่อทั้งคู่
copy.deepcopy()Deep Copyคัดลอกทุกระดับ nested objects

Shallow Copy ปัญหาเมื่อค่าเป็น Mutable Object


import copy

original = {"key": [1, 2, 3]}
shallow = original.copy()

shallow["key"].append(4)
print("original:", original)  # {'key': [1, 2, 3, 4]} - เปลี่ยนไปด้วย!
print("shallow:", shallow)    # {'key': [1, 2, 3, 4]}

# แก้ด้วย deepcopy
deep = copy.deepcopy(original)
deep["key"].append(5)
print("original:", original)  # {'key': [1, 2, 3, 4]} - ไม่เปลี่ยน
print("deep:", deep)          # {'key': [1, 2, 3, 4, 5]}

สรุป

  • Shallow copy (copy(), dict(), **unpacking) - ใช้ได้เมื่อค่าเป็น immutable (int, str, tuple)
  • Deep copy (copy.deepcopy()) - จำเป็นเมื่อค่าเป็น mutable (list, dict, set) และต้องการความเป็นอิสระแท้จริง
  • Assignment (=) - ไม่ใช่ copy แค่สร้าง reference ใหม่