Assignment tạo reference, không phải copy
Hiện tượng lạ
Phần tiêu đề “Hiện tượng lạ”# Tạo listoriginal = [1, 2, 3]copy = original # "Copy"?
# Sửa copycopy.append(4)
# Original cũng thay đổi?!print(original) # [1, 2, 3, 4] ❌print(copy) # [1, 2, 3, 4]What the Python?! Sửa copy mà original cũng đổi?! 😱
Giải thích
Phần tiêu đề “Giải thích”Assignment = Reference
Phần tiêu đề “Assignment = Reference”a = [1, 2, 3]b = a # b trỏ đến CÙNG list với a
# Kiểm traprint(a is b) # True - Cùng object!print(id(a) == id(b)) # TrueVới immutable objects - OK
Phần tiêu đề “Với immutable objects - OK”# Với int (immutable)x = 10y = xy = 20 # Tạo object MỚI
print(x) # 10 ✅print(y) # 20Với mutable objects - NGUY HIỂM
Phần tiêu đề “Với mutable objects - NGUY HIỂM”# Listlist1 = [1, 2]list2 = list1list2.append(3)print(list1) # [1, 2, 3] ❌
# Dictdict1 = {"a": 1}dict2 = dict1dict2["b"] = 2print(dict1) # {'a': 1, 'b': 2} ❌Cách copy đúng
Phần tiêu đề “Cách copy đúng”✅ Shallow copy
Phần tiêu đề “✅ Shallow copy”# Listoriginal = [1, 2, 3]copy = original.copy() # or list(original) or original[:]
copy.append(4)print(original) # [1, 2, 3] ✅print(copy) # [1, 2, 3, 4]
# Dictoriginal = {"a": 1}copy = original.copy()
# Setoriginal = {1, 2}copy = original.copy()✅ Deep copy (nested)
Phần tiêu đề “✅ Deep copy (nested)”import copy
original = [[1, 2], [3, 4]]shallow = original.copy()deep = copy.deepcopy(original)
shallow[0].append(5)print(original) # [[1, 2, 5], [3, 4]] ❌ Shallow không đủ!
deep[0].append(6)print(original) # [[1, 2, 5], [3, 4]] ✅ Deep OK!Tóm tắt
Phần tiêu đề “Tóm tắt”Assignment:
=tạo reference, KHÔNG copy- ✅ Dùng
.copy()cho shallow copy- ✅ Dùng
copy.deepcopy()cho deep copy
Pattern:
new_list = original.copy() # Shallownew_list = copy.deepcopy(original) # Deep