PHP
Python

Trang chủ

Cách copy dictionary trong Python chi tiết

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
04/03/2025
12 phút đọc
Theo dõi Vietnix trên

Cách copy dictionary trong Python chi tiết

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.
  • 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.
  • 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 deep copy tùy vào mức độ sao chép dữ liệu bên trong.

Copy dictionary trong Python là quá trình tạo một bản sao của dictionary gốc
Copy dictionary trong Python là quá trình tạo một bản sao của dictionary gốc

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’]}

Bản sao (vietnix_copy) chứa cùng dữ liệu với dictionary gốc (vietnix_info). Tuy nhiên, nếu có một danh sách bên trong dictionary, như danh sách “services”, thì nó vẫn tham chiếu đến danh sách gốc. Điều này có nghĩa là nếu bạn thay đổi danh sách trong bản sao, dictionary gốc cũng bị ảnh hưởng.

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 caohiệ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:

Cao Lê Viết Tiến

PHP Leader
tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn