ดิกชันนารีเป็นคอลเลกชันที่ไม่มีลำดับ เปลี่ยนแปลงได้ และมีดัชนี เขียนด้วยวงเล็บปีกกา มีคีย์และค่า เมธอด 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() constructor | Shallow Copy | เหมือน copy() |
{**dict} (unpacking) | Shallow Copy | Python 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 ใหม่