Copy dictionary trong Python là quá trình sao chép dữ liệu từ một dictionary sang một dictionary mới, giúp thao tác với dữ liệu linh hoạt hơn mà không ảnh hưởng đến bản gốc. Trong bài viết này, mình sẽ phân tích hai cách sao chép dictionary phổ biến: shallow copy và deep copy. Bạn sẽ hiểu rõ cách hoạt động của từng phương pháp, điểm khác biệt và khi nào nên sử dụng chúng để tránh lỗi không mong muốn trong lập trình.
Điểm chính cần nắm
- Copy dictionary trong Python là gì?: Copy dictionary là quá trình sao chép dữ liệu từ một dictionary sang một dictionary mới trong Python.
- Shallow copy trong Python: Shallow copy tạo một dictionary mới nhưng các phần tử bên trong vẫn tham chiếu đến cùng một đối tượng trong bộ nhớ như bản gốc.
- Sử dụng phương thức .copy(): Phương thức
.copy()
tạo một bản sao của dictionary, nhưng các phần tử bên trong (nếu là mutable) vẫn liên kết với bản gốc. - Sử dụng phương thức dict(): Hàm
dict()
hoạt động tương tự.copy()
, giúp tạo bản sao của dictionary với cùng một tham chiếu đến các phần tử mutable.
- Sử dụng phương thức .copy(): Phương thức
- Deep copy trong Python: Deep copy tạo một bản sao hoàn toàn mới của dictionary, bao gồm cả các đối tượng lồng bên trong, giúp tránh ảnh hưởng đến dữ liệu gốc.
- Copy dictionary bằng phương thức copy(): Phương thức
.copy()
giúp sao chép dictionary nhanh chóng, nhưng chỉ tạo một shallow copy.- Syntax – Cú pháp: Cú pháp sử dụng
.copy()
trong Python lànew_dict = original_dict.copy()
, giúp sao chép dictionary gốc thành một bản mới. - Ví dụ minh họa: Đoạn code minh họa cách sử dụng
.copy()
để sao chép dictionary và cho thấy sự khác biệt khi thay đổi dữ liệu mutable trong bản sao.
- Syntax – Cú pháp: Cú pháp sử dụng
- Vietnix – Giải pháp lưu trữ tốc độ cao, an toàn và đáng tin cậy: Vietnix cung cấp dịch vụ máy chủ, hosting, VPS, domain với hiệu suất cao, bảo mật tốt và hỗ trợ kỹ thuật 24/7.
Copy dictionary trong Python là gì?
Copy dictionary trong Python là quá trình tạo một bản sao của dictionary gốc, giúp thao tác trên dữ liệu mà không làm ảnh hưởng đến bản gốc. Python hỗ trợ sao chép dictionary theo hai cách: shallow copy và deep copy tùy vào mức độ sao chép dữ liệu bên trong.

Shallow copy trong Python
Shallow copy trong Python là quá trình tạo một bản sao của dictionary, nhưng các phần tử bên trong vẫn tham chiếu đến cùng đối tượng trong bộ nhớ như bản gốc. Điều này giúp sao chép cấu trúc của dictionary mà không sao chép các đối tượng lồng bên trong.
Cụ thể:
- Các cặp key-value của dictionary được sao chép sang một dictionary mới.
- Các giá trị immutable (số, chuỗi, tuple) được sao chép độc lập. Nếu thay đổi một giá trị immutable thì bản gốc không bị ảnh hưởng.
- Các giá trị mutable (list, dictionary con) vẫn giữ tham chiếu đến cùng đối tượng trong bộ nhớ. Nếu thay đổi một đối tượng mutable thì bản gốc cũng sẽ thay đổi theo.
Shallow copy có thể được thực hiện bằng phương thức .copy()
hoặc hàm dict()
.
Sử dụng phương thức .copy()
Để hiểu rõ hơn về cách hoạt động của shallow copy, mình sẽ lấy một ví dụ với dữ liệu của Vietnix. Sau đó, chúng ta sẽ phân tích xem điều gì xảy ra khi thay đổi các giá trị trong bản sao.
Ví dụ:
Trong ví dụ này, khi thay đổi địa chỉ ("address"
) trong bản sao, giá trị trong dictionary gốc không bị ảnh hưởng. Tuy nhiên, khi thay đổi danh sách dịch vụ ("services"
) trong bản sao, dictionary gốc cũng bị thay đổi. Nguyên nhân là do danh sách là một đối tượng có thể thay đổi (mutable), và .copy()
chỉ sao chép tham chiếu đến danh sách gốc thay vì tạo một bản sao mới hoàn toàn.
# Dữ liệu gốc của Vietnix
vietnix_info = {
"name": "Vietnix",
"address": "647 Lý Thường Kiệt, Phường 11, Quận Tân Bình, TP.HCM",
"services": ["VPS", "Hosting", "Server"],
"founded": 2012
}
# Tạo bản sao bằng phương thức copy()
vietnix_copy = vietnix_info.copy()
# Thay đổi địa chỉ trong bản sao
vietnix_copy["address"] = "265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM"
# Thêm một dịch vụ mới vào danh sách trong bản sao
vietnix_copy["services"].append("Firewall")
# In kết quả
print("Dữ liệu gốc:", vietnix_info)
print("Bản sao:", vietnix_copy)
Kết quả:
- Dữ liệu gốc: {‘name’: ‘Vietnix’, ‘address’: ‘647 Lý Thường Kiệt, Phường 11, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’, ‘Firewall’], ‘founded’: 2012}
- Bản sao: {‘name’: ‘Vietnix’, ‘address’: ‘265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’, ‘Firewall’], ‘founded’: 2012}
Giải thích:
- Địa chỉ (
"address"
): Chỉ thay đổi trong bản sao, không ảnh hưởng đến dữ liệu gốc. - Danh sách dịch vụ (
"services"
): Cả bản sao và dữ liệu gốc đều bị thay đổi. Điều này xảy ra vì danh sách là một đối tượng có thể thay đổi (mutable), và.copy()
chỉ sao chép tham chiếu của danh sách thay vì tạo một bản sao mới.
Sử dụng phương thức dict()
Một cách khác để sao chép dictionary trong Python là sử dụng hàm dict()
. Cách này hoạt động tương tự như phương thức .copy()
, nghĩa là nó tạo một dictionary mới nhưng các giá trị bên trong vẫn tham chiếu đến cùng một đối tượng trong bộ nhớ. Để minh họa, mình sẽ lấy một ví dụ với dữ liệu của Vietnix. Sau đó, chúng ta sẽ phân tích điều gì xảy ra khi thay đổi dữ liệu trong bản sao.
Ví dụ:
# Dữ liệu gốc của Vietnix
vietnix_info = {
"name": "Vietnix",
"address": "647 Lý Thường Kiệt, Phường 11, Quận Tân Bình, TP.HCM",
"services": ["VPS", "Hosting", "Server"],
"founded": 2012
}
# Tạo bản sao bằng phương thức dict()
vietnix_copy = dict(vietnix_info)
# Thay đổi địa chỉ trong bản sao
vietnix_copy["address"] = "265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM"
# Thêm một dịch vụ mới vào danh sách trong bản sao
vietnix_copy["services"].append("Firewall")
# In kết quả
print("Dữ liệu gốc:", vietnix_info)
print("Bản sao:", vietnix_copy)
Kết quả:
- Dữ liệu gốc: {‘name’: ‘Vietnix’, ‘address’: ‘647 Lý Thường Kiệt, Phường 11, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’, ‘Firewall’], ‘founded’: 2012}
- Bản sao: {‘name’: ‘Vietnix’, ‘address’: ‘265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’, ‘Firewall’], ‘founded’: 2012}
Giải thích:
- Thay đổi địa chỉ (
"address"
): Khi cập nhật địa chỉ trong bản sao (vietnix_copy
), giá trị trong dictionary gốc (vietnix_info
) không bị ảnh hưởng. Điều này là do chuỗi (str
) là một đối tượng bất biến (immutable), nên khi gán một giá trị mới, Python tạo một bản sao hoàn toàn tách biệt. - Thay đổi danh sách dịch vụ (
"services"
): Khi thêm"Firewall"
vào danh sách trong bản sao, danh sách trong dữ liệu gốc cũng thay đổi theo. Nguyên nhân là do danh sách là một đối tượng có thể thay đổi (mutable), vàdict()
chỉ sao chép tham chiếu đến danh sách gốc thay vì tạo một bản sao mới hoàn toàn.
Deep copy trong Python
Khi sử dụng phương thức .copy()
hoặc hàm dict()
, chúng ta chỉ tạo một bản sao của dictionary, nhưng các phần tử bên trong vẫn tham chiếu đến cùng một đối tượng trong bộ nhớ. Điều này dẫn đến tình huống khi thay đổi danh sách hoặc dictionary lồng nhau trong bản sao, dữ liệu gốc cũng bị thay đổi theo.
Nếu muốn tạo một bản sao hoàn toàn độc lập, deep copy là lựa chọn tối ưu hơn. Deep copy tạo ra một dictionary mới và sao chép đệ quy tất cả các đối tượng bên trong. Điều này có nghĩa là không chỉ dictionary mà tất cả các đối tượng nó chứa (bao gồm cả các dictionary lồng nhau, danh sách, v.v.) đều được sao chép. Kết quả là, các thay đổi được thực hiện trên deep copy không ảnh hưởng đến dictionary gốc và ngược lại.
Ví dụ:
Trong ví dụ dưới đây, chúng ta có thể thấy rằng địa chỉ “address” trong deep copy đã được thay đổi, danh sách “services” trong deep copy được sửa đổi (một dịch vụ mới được thêm vào), nhưng dữ liệu gốc của Vietnix vẫn giữ nguyên mà không bị ảnh hưởng.
import copy
# Dữ liệu gốc của Vietnix
vietnix_info = {
"name": "Vietnix",
"address": "647 Lý Thường Kiệt, Phường 11, Quận Tân Bình, TP.HCM",
"services": ["VPS", "Hosting", "Server"],
"founded": 2012
}
# Tạo deep copy bằng deepcopy()
vietnix_deep_copy = copy.deepcopy(vietnix_info)
# Thay đổi địa chỉ trong bản sao
vietnix_deep_copy["address"] = "265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM"
# Thêm một dịch vụ mới vào danh sách trong bản sao
vietnix_deep_copy["services"].append("Firewall")
# In kết quả
print("Dữ liệu gốc:", vietnix_info)
print("Bản sao sâu:", vietnix_deep_copy)
Kết quả:
- Dữ liệu gốc: {‘name’: ‘Vietnix’, ‘address’: ‘647 Lý Thường Kiệt, Phường 11, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’], ‘founded’: 2012}
- Bản sao sâu: {‘name’: ‘Vietnix’, ‘address’: ‘265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’, ‘Firewall’], ‘founded’: 2012}
Copy dictionary bằng phương thức copy()
Trong Python, dictionary không thể được sao chép trực tiếp bằng toán tử gán (=
), vì thao tác này chỉ tạo một tham chiếu đến dictionary gốc thay vì tạo một bản sao mới. Để tạo một bản sao, bạn có thể sử dụng phương thức .copy()
, giúp tạo một dictionary mới nhưng vẫn giữ tham chiếu đến các đối tượng bên trong.
Syntax – Cú pháp
Dưới đây là cú pháp cơ bản của phương thức .copy()
trong Python. Trong đó, original_dict
là dictionary bạn muốn sao chép.
new_dict = original_dict.copy()
Ví dụ minh họa
Dưới đây là ví dụ minh họa việc tạo một Shallow copy của dictionary bằng cách sử dụng phương thức copy():
# Tạo dictionary chứa thông tin Vietnix
vietnix_info = {
"company": "Vietnix",
"address": "265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM",
"services": ["VPS", "Hosting", "Server"]
}
# Sao chép dictionary bằng phương thức copy()
vietnix_copy = vietnix_info.copy()
# In ra cả hai dictionary
print("Thông tin gốc:", vietnix_info)
print("Bản sao:", vietnix_copy)
Kết quả:
- Thông tin gốc: {‘company’: ‘Vietnix’, ‘address’: ‘265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’]}
- Bản sao: {‘company’: ‘Vietnix’, ‘address’: ‘265 Hồng Lạc, Phường 10, Quận Tân Bình, TP.HCM’, ‘services’: [‘VPS’, ‘Hosting’, ‘Server’]}
Vietnix – Giải pháp lưu trữ tốc độ cao, an toàn và đáng tin cậy
Vietnix tự hào là một trong những nhà cung cấp dịch vụ thuê server, hosting, VPS, đăng ký tên miền hàng đầu tại Việt Nam. Với sứ mệnh mang đến giải pháp lưu trữ tối ưu, bảo mật cao và hiệu suất vượt trội, Vietnix cam kết cung cấp dịch vụ chất lượng cùng đội ngũ hỗ trợ kỹ thuật chuyên nghiệp 24/7. Hơn 80.000 khách hàng đã tin tưởng lựa chọn Vietnix nhờ hệ thống máy chủ mạnh mẽ, ổn định cùng dịch vụ tư vấn tận tâm, giúp doanh nghiệp vận hành hiệu quả và an toàn.
Thông tin liên hệ:
- Website: vietnix.vn
- Hotline: 18001093
- Email: sales@vietnix.com.vn
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, TP. Hồ Chí Minh
Lời kết
Việc sao chép dictionary trong Python tưởng chừng đơn giản nhưng nếu không hiểu rõ bản chất, bạn có thể gặp phải những lỗi khó kiểm soát khi làm việc với dữ liệu mutable. Hy vọng qua bài viết này, bạn đã nắm vững sự khác biệt giữa shallow copy và deep copy, cũng như biết cách sử dụng chúng một cách hiệu quả. Nếu bạn có bất cứ thắc mắc hay cần hỗ trợ gì, hãy để lại bình luận bên dưới, mình sẽ phản hồi nhanh nhất. Cảm ơn bạn đã đọc!
Mọi người cũng xem: