5 cách sao chép danh sách bằng Python: Hãy khám phá chúng – sao chép một danh sách trong python

Việc sao chép một danh sách trong các chương trình Python của bạn là rất phổ biến. Tuy nhiên, những gì bạn hoàn toàn nên biết về việc sao chép danh sách?

Bạn đang xem : sao chép danh sách trong python

Việc sao chép danh sách trong các chương trình Python của bạn rất phổ biến. Tuy nhiên, bạn hoàn toàn nên biết những gì về việc sao chép danh sách?

Làm thế nào để sao chép một danh sách Python?

Python cung cấp nhiều cách để sao chép danh sách tùy thuộc vào những gì chương trình của bạn cần làm với danh sách hiện có. Bạn có thể sử dụng toán tử gán, phương pháp sao chép danh sách, ký hiệu lát cắt và sao chép nông hoặc sâu.

Hướng dẫn này được thiết kế để hiển thị cho bạn mọi thứ bạn cần biết về sao chép danh sách bằng Python.

Hãy bắt đầu!

< / p>

Cách tạo bản sao danh sách bằng Python

Tôi sẽ bắt đầu với một ví dụ đơn giản để cùng nhau hiểu cách sao chép danh sách hoạt động trong Python.

Sau khi xác định một danh sách được gọi là số, tôi sử dụng toán tử gán (=) để sao chép danh sách này sang một danh sách mới có tên là new_numbers.

Hãy xem điều gì sẽ xảy ra…

  & gt; & gt; & gt; số = [1,4,7,19,23]
& gt; & gt; & gt; new_numbers = number  

Bây giờ, tôi thêm một phần tử mới vào danh sách new_numbers bằng cách sử dụng phương pháp nối thêm và xác minh các phần tử trong cả hai danh sách bằng cách sử dụng hàm in < / strong>:

  & gt; & gt; & gt; new_numbers.append (34)
& gt; & gt; & gt; in (số)
[1, 4, 7, 19, 23, 34]
& gt; & gt; & gt; print (new_numbers)
[1, 4, 7, 19, 23, 34]  

Vì một số lý do, ngay cả khi chúng tôi chỉ thêm số mới vào danh sách new_numbers, cả hai danh sách của chúng tôi đều chứa số mới.

Tại sao?

Chúng tôi sẽ sử dụng hàm id tích hợp sẵn để in địa chỉ bộ nhớ của hai danh sách và để làm cho nó dễ đọc hơn, chúng tôi cũng sẽ sử dụng hàm hex cung cấp biểu diễn thập lục phân của một số nguyên.

  & gt; & gt; & gt; hex (id (số))
'0x10d75e5a0'
& gt; & gt; & gt; hex (id (new_numbers))
'0x10d75e5a0'  

Thú vị…

Bạn có thấy sự cố không?

Cả hai biến đều trỏ đến cùng một địa chỉ bộ nhớ , vì vậy số và new_numbers trỏ đến cùng một đối tượng danh sách . Đó là lý do tại sao chúng ta thấy phần tử mới trong cả hai.

Vậy, làm cách nào để sao chép danh sách của mình sang một đối tượng hoàn toàn mới?

Cách tạo bản sao thực tế của danh sách gốc

Python cung cấp < strong> phương thức sao chép danh sách cho phép tạo đối tượng danh sách mới từ đối tượng chúng tôi sao chép.

Hãy sử dụng phương pháp sao chép trên danh sách ban đầu của chúng tôi để tạo danh sách new_numbers:

< pre class = "wp-block-code"> new_numbers = number.copy ()

Bây giờ chúng ta sẽ thêm một số vào danh sách mới mà chúng tôi đã tạo và chúng tôi sẽ xác minh rằng số không có trong danh sách ban đầu:

  & gt; & gt; & gt; new_numbers.append (34)
& gt; & gt; & gt; in (số)
[1, 4, 7, 19, 23]
& gt; & gt; & gt; print (new_numbers)
[1, 4, 7, 19, 23, 34]  

Lần này danh sách ban đầu không bị thay đổi bằng phương pháp nối được áp dụng cho danh sách mới.

Và để xác nhận, chúng tôi cũng sẽ xác minh vị trí bộ nhớ của cả hai đối tượng trong danh sách:

  & gt; & gt; & gt; hex (id (số))
'0x10751d460'
& gt; & gt; & gt; hex (id (new_numbers))
'0x10761d9b0'  

Địa chỉ bộ nhớ khác nhau cho hai đối tượng. Thật tốt!

Sao chép bằng Python Slice Notation

< p> Một cách khác để sao chép danh sách Python là sử dụng ký hiệu lát cắt .

Ký hiệu lát cắt có thể được sử dụng để sao chép các phần của danh sách vào danh sách mới hoặc thậm chí toàn bộ danh sách chỉ bằng cách sử dụng biểu thức sau:

  new_list = original_list [:]   

Hãy áp dụng nó vào danh sách số của chúng tôi:

  & gt; & gt; & gt; new_numbers = number [:]  

Sau khi thêm một số khác vào danh sách mới, bạn có thể thấy rằng danh sách ban đầu, một lần nữa, không thay đổi:

  & gt; & gt; & gt; new_numbers.append (34)
& gt; & gt; & gt; in (số)
[1, 4, 7, 19, 23]
& gt; & gt; & gt; print (new_numbers)
[1, 4, 7, 19, 23, 34]  

Và với ký hiệu lát cắt, chúng tôi đã tạo một đối tượng danh sách mới:

  & gt; & gt; & gt; hex (id (số))
'0x105e92460'
& gt; & gt; & gt; hex (id (new_numbers))
'0x105f925f0'  

Và cái này cũng đã xong! 🙂

Bản sao nông so với Bản sao sâu

Sự khác biệt giữa bản sao cạn bản sao sâu chỉ áp dụng cho các đối tượng ghép, hay nói cách khác là cho các đối tượng có chứa các đối tượng khác.

Ví dụ về các đối tượng ghép là bản sao lớp danh sách . < / p>

Mô-đun sao chép của Python cho phép tạo các bản sao nông và bản sao sâu của các đối tượng. Dưới đây, bạn có thể thấy cú pháp cho cả hai loại bản sao:

  SHALLOW COPY: new_object = copy. sao chép (original_object)
SAO CHÉP SÂU: new_object = copy.deepcopy (original_object)  

Với một bản sao cạn, một đối tượng ghép mới sẽ được tạo (ví dụ: danh sách các danh sách) và các tham chiếu đến các đối tượng được tìm thấy trong đối tượng gốc được thêm vào đối tượng ghép mới.

Trong phần tiếp theo, chúng ta sẽ xem chính xác cách hoạt động của một bản sao cạn.

Trong thời gian chờ đợi, tôi muốn làm rõ sự khác biệt giữa bản sao cạn và bản sao sâu.

Bản sao sâu tạo ra một đối tượng ghép mới (ví dụ: danh sách các danh sách), sau đó nó cũng tạo ra các bản sao của các đối tượng được tìm thấy trong đối tượng gốc và chèn chúng vào đối tượng ghép mới.

Các định nghĩa về bản sao cạn và bản sao sâu sẽ rõ ràng hơn rất nhiều trong các phần tiếp theo, nơi chúng ta sẽ xem cách chúng hoạt động trong thực tế.

Cách tạo bản sao nông trong Python

Hãy xem cách một bản sao cạn hoạt động với một danh sách…

… hãy thử những com sau liên kết trong trình bao Python của bạn để đảm bảo hành vi sao chép nông và sâu là rõ ràng đối với bạn:

  & gt; & gt; & gt; nhập bản sao
& gt; & gt; & gt; số = [[1,2,3], [4,5,6], [7,8,9]]
& gt; & gt; & gt; new_numbers = copy.copy (number)  

Nếu tôi thêm một phần tử vào danh sách new_numbers, danh sách ban đầu không thay đổi:

  & gt; & gt; & gt; new_numbers.append ([10,11,12])
& gt; & gt; & gt; con số
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
& gt; & gt; & gt; new_numbers
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]  

Điều này khẳng định rằng sao chép một đối tượng phức hợp mới đã được tạo. Nói cách khác, đối tượng ghép mới không phải là một tham chiếu đến đối tượng gốc.

Nhưng bây giờ, hãy thử cập nhật một phần tử chung giữa danh sách gốc và danh sách mới:

  & gt; & gt; & gt; new_numbers [0] [0] = 4
& gt; & gt; & gt; con số
[[4, 2, 3], [4, 5, 6], [7, 8, 9]]
& gt; & gt; & gt; new_numbers
[[4, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]  

Tôi đã cập nhật phần tử đầu tiên của đối tượng danh sách đầu tiên trong danh sách gốc.

Như bạn có thể thấy, phần tử đã được cập nhật trong cả hai danh sách, danh sách gốc và danh sách mới.

Đó là bởi vì chúng tôi đã sử dụng bản sao cạn và do đó phần tử đầu tiên của danh sách new_numbers chỉ là tham chiếu đến phần tử đầu tiên của danh sách số ([1,2,3]).

< / p>

Cách tạo Bản sao sâu trong Python

< / p>

Hãy tạo một bản sao sâu từ cùng một danh sách các danh sách trong phần trước…

 & gt; & gt; & gt; nhập bản sao
& gt; & gt; & gt; số = [[1,2,3], [4,5,6], [7,8,9]]
& gt; & gt; & gt; new_numbers = copy.deepcopy (number)  

Một lần nữa, hãy thêm một phần tử vào danh sách new_numbers:

  & gt; & gt; & gt; new_numbers.append ([10,11,12])
& gt; & gt; & gt; con số
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
& gt; & gt; & gt; new_numbers
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]  

Như mong đợi, danh sách ban đầu có không thay đổi sau khi thêm danh sách mới vào danh sách mới.

Theo cách tương tự chúng ta đã làm trong phần trước, hãy thay đổi phần tử đầu tiên của danh sách đầu tiên trong danh sách new_numbers và xem điều gì sẽ xảy ra… < / p>

  & gt; & gt; & gt; new_numbers [0] [0] = 4
& gt; & gt; & gt; con số
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
& gt; & gt; & gt; new_numbers
[[4, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]  

Lần này, dựa trên định nghĩa về bản sao sâu , danh sách gốc không bị thay đổi khi chúng tôi cập nhật giá trị của phần tử đầu tiên trong danh sách đầu tiên của danh sách new_numbers.

Bây giờ, bạn có thể thấy sự khác biệt giữa bản sao cạn và bản sao sâu?

Kết luận

Trong hướng dẫn này, bạn đã học cách sao chép danh sách Python theo nhiều cách khác nhau:

  • Sử dụng toán tử gán theo cách giống như bạn. thường làm khi gán giá trị cho một biến.
  • Với phương pháp sao chép danh sách .
  • Sử dụng ký hiệu lát cắt Python [:].
  • Với bản sao nông hoặc bản sao sâu tùy thuộc vào cách bạn muốn cấu trúc đối tượng ghép của mình.

Và bây giờ bạn cũng biết cách tránh những sai lầm do cách Python xử lý bản sao của đối tác có thể thay đổi các mục như danh sách 🙂

Tôi là Trưởng nhóm kỹ thuật, Kỹ sư phần mềm và Huấn luyện viên lập trình. Tôi muốn giúp bạn trong hành trình trở thành Nhà phát triển cấp cao!


Xem thêm những thông tin liên quan đến chủ đề sao chép một danh sách trong python

Kiểu dữ liệu List (Danh sách) trong Python #1

  • Tác giả: Gà Python
  • Ngày đăng: 2021-11-26
  • Đánh giá: 4 ⭐ ( 5546 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Kiểu dữ liệu List (Danh sách) trong Python 1

Chi tiết bài học 19.Sao chép tệp trong Python bằng cách sử dụng shutil.copy (), shutil.copystat ()

  • Tác giả: vimentor.com
  • Đánh giá: 5 ⭐ ( 6372 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Vimentor chi tiết bài học Sao chép tệp trong Python bằng cách sử dụng shutil.copy (), shutil.copystat ()

Bài 6 – Kiểu dữ liệu danh sách (list) trong ngôn ngữ lập trình Python

  • Tác giả: www.vniteach.com
  • Đánh giá: 4 ⭐ ( 7825 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Lập trình Python 1. Tìm hiểu kiểu dữ liệu list - Mảng là tập hợp các phần tử cùng một kiểu dữ liệu duy nhất như: mảng số nguyên, mảng số thực, mảng xâu,… Nhưng trong Python không có kiểu dữ liệu mảng mà sử dụng kiểu danh sách (list). - Không giống như mảng,

List trong Python - Các bước tạo list Python nhanh và hiệu quả

  • Tác giả: t3h.com.vn
  • Đánh giá: 4 ⭐ ( 3050 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: List trong Python cho phép lưu trữ nhiều kiểu dữ liệu khác và truy xuất các phần tử bên trong nó thông qua vị trí của phần tử đó trong list

[Python] Phần 8: Danh sách (List) trong Python

  • Tác giả: www.dammio.com
  • Đánh giá: 4 ⭐ ( 1280 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

List copy() trong Python

  • Tác giả: freetuts.net
  • Đánh giá: 4 ⭐ ( 9080 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tìm hiểu phương thức List copy() trong Python dùng để copy một bản sao thô của list, vài ví dụ về cách sử dụng hàm list.copy() trong python tại đây

Tạo danh sách các đối tượng trong Python

  • Tác giả: qastack.vn
  • Đánh giá: 3 ⭐ ( 6840 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: [Tìm thấy giải pháp!] Bạn chứng tỏ một sự hiểu lầm cơ bản. Bạn chưa bao giờ tạo một phiên…

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình

Xem Thêm  Cách sử dụng chữ cái và chữ số La mã trong danh sách được đánh số (HTML - danh sách html chữ số la mã