Chained assignment - a = b = []
Hiện tượng lạ
Phần tiêu đề “Hiện tượng lạ”# Chained assignmenta = b = []
# Sửa aa.append(1)
# b cũng thay đổi?!print(a) # [1]print(b) # [1] ❌What the Python?! Sửa a mà b cũng đổi?! 😱
Giải thích
Phần tiêu đề “Giải thích”Chained assignment = Cùng object
Phần tiêu đề “Chained assignment = Cùng object”a = b = []# Tương đương:# temp = []# a = temp# b = temp
# a và b trỏ đến CÙNG listprint(a is b) # TrueVới immutable - OK
Phần tiêu đề “Với immutable - OK”x = y = 10x = 20 # Tạo object MỚI, reassign x
print(x) # 20print(y) # 10 ✅ Không ảnh hưởngVới mutable - NGUY HIỂM
Phần tiêu đề “Với mutable - NGUY HIỂM”# Lista = b = []a.append(1)print(b) # [1] ❌
# Dictx = y = {}x["key"] = "value"print(y) # {'key': 'value'} ❌Cách đúng
Phần tiêu đề “Cách đúng”✅ Assign riêng
Phần tiêu đề “✅ Assign riêng”a = []b = []
a.append(1)print(a) # [1]print(b) # [] ✅✅ Hoặc copy
Phần tiêu đề “✅ Hoặc copy”a = []b = a.copy()
a.append(1)print(a) # [1]print(b) # [] ✅Tóm tắt
Phần tiêu đề “Tóm tắt”Chained assignment:
a = b = []→ Cùng object- ⚠️ NGUY HIỂM với mutable
- ✅ Assign riêng hoặc copy
Pattern:
# ❌ Tránha = b = []
# ✅ Làma = []b = []