Cách sao chép một biến trong Python mà không thay đổi bản gốc

Trong blog này, chúng ta sẽ tìm hiểu về một phương thức mới trong Python - copy list. Trong khi viết mã, có những lúc người dùng cần sử dụng lại một đối tượng. Gõ lại từng dòng mã có vẻ vô dụng. Do đó, chúng tôi sử dụng phương pháp sao chép có sẵn trong danh sách

Mục lục

  1. Giới thiệu về danh sách sao chép
  2. Phương pháp danh sách sao chép Python
  3. Sao chép danh sách bằng cách sử dụng =
  4. Sử dụng phương thức tích hợp list() để sao chép danh sách
  5. Bớt tư tưởng

Giới thiệu về danh sách sao chép

Nghe có vẻ dễ dàng, sao chép một danh sách trong Python khá đơn giản. Nhưng chúng ta vẫn phải tuân theo cú pháp và biết khi nào và làm thế nào để sử dụng phương pháp sao chép danh sách. Phương pháp này giúp dễ dàng viết các phần mã xảy ra nhiều lần

Nói rõ hơn, phương pháp này chỉ hoạt động trong danh sách

Phương pháp danh sách sao chép Python

Phương thức copy() trong Python sao chép danh sách và trả về danh sách đã sao chép. Nó không nhận bất kỳ tham số nào và trả về một bản sao nông của danh sách
Bản sao nông là bản không hiển thị bất kỳ sửa đổi nào trong danh sách gốc. Danh sách được sao chép trỏ đến một vị trí bộ nhớ khác với danh sách ban đầu, vì vậy việc thay đổi một danh sách không ảnh hưởng đến danh sách khác

cú pháp

list_new = list.copy()

Đầu vào

#Defining a list
list = [a,b,c]

#Copying list
list_new = list.copy()

print ("This is the new list: " + str(list_new))

list_new.append(d)

print ("The new list after adding a new element: " + str(list_new))
print ("The old list after adding a new element" + str(list))

Ở đây, chúng tôi đã tạo một danh sách và sau đó sao chép danh sách. Khi bạn thêm một phần tử vào danh sách mới, bạn có thể thấy rằng danh sách cũ không hiển thị sửa đổi

đầu ra

This is the new list: [a,b,c]
The new list after adding a new element: [a,b,c,d]
The old list after adding a new element: [a,b,c]

Sao chép danh sách bằng cách sử dụng =

Chúng ta có thể sử dụng toán tử = để sao chép danh sách. Hạn chế duy nhất của phương pháp này là nó không tạo ra một bản sao nông
Điều đó nói rằng, nếu chúng tôi thực hiện bất kỳ sửa đổi nào đối với danh sách mới, danh sách cũ cũng sẽ được sửa đổi

Đầu vào

#Defining a list
list = [a,b,c]


#Copying list
list_new = list


print ("This is the new list: " + str(list_new))


list_new.append(d)


print ("The new list after adding a new element: " + str(list_new))
print ("The old list after adding a new element" + str(list))

Ở đây, chúng tôi đã tạo một danh sách và sau đó sao chép danh sách. Khi bạn thêm một phần tử vào danh sách mới, bạn có thể thấy rằng danh sách cũ cũng được sửa đổi vì phương pháp này không tạo bản sao nông

đầu ra

This is the new list: [a,b,c]
The new list after adding a new element: [a,b,c,d]
The old list after adding a new element: [a,b,c,d]

Sử dụng phương thức tích hợp list() để sao chép danh sách

Một cách khác để sao chép danh sách trong Python là sử dụng phương thức tích hợp sẵn list(). Nó cũng tạo ra một bản sao nông, nghĩa là bất cứ khi nào một sửa đổi được thực hiện trong danh sách mới, nó sẽ không hiển thị trên danh sách cũ

Đầu vào

#Defining a list
list = [a,b,c]


#Copying list
list_new = list(list)


print ("This is the new list: " + str(list_new))


list_new.append(d)


print ("The new list after adding a new element: " + str(list_new))
print ("The old list after adding a new element" + str(list)

Ở đây, chúng tôi đã tạo một danh sách và sau đó sao chép danh sách. Khi bạn thêm một phần tử vào danh sách mới, bạn có thể thấy rằng danh sách cũ không hiển thị sửa đổi

đầu ra

This is the new list: [a,b,c]
The new list after adding a new element: [a,b,c,d]
The old list after adding a new element: [a,b,c]

Bớt tư tưởng

Sao chép danh sách là một cách dễ dàng để sao chép trong Python. Đó là một phương thức tích hợp giúp viết mã dễ dàng hơn. Bạn có thể sử dụng các phương pháp khác được đề cập ở trên nhưng hãy chắc chắn rằng bạn biết về. Mọi người có thể đọc thêm về các khái niệm Python tại đây

Cả spread (

let counter = 1;
let copiedCounter = counter;
3) và
let counter = 1;
let copiedCounter = counter;
4 đều thực hiện một bản sao nông trong khi các phương thức JSON thực hiện một bản sao sâu

Bản sao nông vs. sao chép sâu

Trong JavaScript, bạn sử dụng các biến để lưu trữ các giá trị có thể là giá trị nguyên thủy hoặc tham chiếu. Khi bạn tạo một bản sao của một giá trị được lưu trữ trong một biến, bạn tạo một biến mới có cùng giá trị. Đối với một giá trị nguyên thủy, bạn chỉ cần sử dụng một phép gán đơn giản

let counter = 1;
let copiedCounter = counter;

Và khi bạn thay đổi giá trị của biến được sao chép, giá trị của biến ban đầu vẫn giữ nguyên

copiedCounter = 2;
console.log(counter);

đầu ra

1

Tuy nhiên, nếu bạn sử dụng toán tử gán cho một giá trị tham chiếu, nó sẽ không sao chép giá trị. Thay vào đó, cả hai biến sẽ tham chiếu cùng một đối tượng trong bộ nhớ

let person = {
firstName: 'John',
lastName: 'Doe'
};
let copiedPerson = person;

Và khi truy cập đối tượng thông qua biến mới (copiedPerson) và thay đổi giá trị thuộc tính của nó (tên) thì bạn cũng thay đổi giá trị thuộc tính của đối tượng

copiedPerson.firstName = 'Jane';
console.log(person);

đầu ra

{
firstName: 'Jane',
lastName: 'Doe'
}

Sao chép sâu có nghĩa là giá trị của biến mới bị ngắt kết nối với biến ban đầu trong khi sao chép nông có nghĩa là một số giá trị vẫn được kết nối với biến ban đầu

Ví dụ sao chép nông

Xem xét ví dụ sau

let person = {
firstName: 'John',
lastName: 'Doe',
address: {
street: 'North 1st street',
city: 'San Jose',
state: 'CA',
country: 'USA'
}
};
let copiedPerson = Object.assign({}, person);copiedPerson.firstName = 'Jane'; // disconnectedcopiedPerson.address.street = 'Amphitheatre Parkway'; // connected
copiedPerson.address.city = 'Mountain View'; // connected
console.log(copiedPerson);

trong ví dụ này

  • Đầu tiên, tạo một đối tượng mới có tên là
    let counter = 1;
    let copiedCounter = counter;
    9
  • Thứ hai, sao chép đối tượng
    let counter = 1;
    let copiedCounter = counter;
    9 bằng phương pháp
    let counter = 1;
    let copiedCounter = counter;
    4
  • Thứ ba, thay đổi thông tin họ tên, địa chỉ của đối tượng
    copiedCounter = 2;
    console.log(counter);
    2

Đây là đầu ra

{
firstName: 'Jane',
lastName: 'Doe',
address: {
street: 'Amphitheatre Parkway',
city: 'Mountain View',
state: 'CA',
country: 'USA'
}
}

Tuy nhiên, khi bạn hiển thị các giá trị của đối tượng người, bạn sẽ thấy rằng thông tin địa chỉ đã thay đổi nhưng tên

console.log(person);

đầu ra

let counter = 1;
let copiedCounter = counter;
0

Lý do là địa chỉ là giá trị tham chiếu trong khi tên là giá trị nguyên thủy. Cả

let counter = 1;
let copiedCounter = counter;
9 và
copiedCounter = 2;
console.log(counter);
2 đều tham chiếu đến các đối tượng khác nhau nhưng những đối tượng này tham chiếu đến cùng một đối tượng
copiedCounter = 2;
console.log(counter);
5

Ví dụ sao chép sâu

Đoạn mã sau thay thế phương thức

let counter = 1;
let copiedCounter = counter;
4 bằng phương thức JSON để mang một bản sao sâu của đối tượng
let counter = 1;
let copiedCounter = counter;
9

let counter = 1;
let copiedCounter = counter;
1

đầu ra

let counter = 1;
let copiedCounter = counter;
2

Trong ví dụ này, tất cả các giá trị trong đối tượng

copiedCounter = 2;
console.log(counter);
2 bị ngắt kết nối với đối tượng
let counter = 1;
let copiedCounter = counter;
9 ban đầu

Làm cách nào để tạo một bản sao danh sách bằng Python mà không thay đổi bản gốc?

Phương thức Python copy() sao chép danh sách và trả về danh sách đã sao chép. Nó không nhận bất kỳ tham số nào và trả về một bản sao nông của danh sách. Bản sao nông là bản không hiển thị bất kỳ sửa đổi nào trong danh sách gốc.

Làm cách nào để sao chép danh sách mà không trỏ cùng một địa chỉ bộ nhớ tham chiếu?

Để sao chép một danh sách hiện có sang một danh sách khác mà không cần tham chiếu, bạn có thể sử dụng phương thức copy() . Trong ví dụ này, chúng tôi đã sao chép danh sách đầu tiên sang danh sách thứ hai bằng hàm copy(). Danh sách thứ hai là một danh sách riêng biệt, không phải là một tài liệu tham khảo.

Sự khác biệt giữa Deepcopy và sao chép là gì?

Một bản sao nông xây dựng một đối tượng phức hợp mới và sau đó (trong phạm vi có thể) chèn các tham chiếu vào đối tượng đó trong bản gốc. Bản sao sâu xây dựng một đối tượng phức hợp mới và sau đó, theo cách đệ quy, chèn các bản sao của các đối tượng được tìm thấy trong bản gốc vào đó .

Làm cách nào để sao chép danh sách mà không trỏ đến cùng một danh sách trong bộ nhớ Python?

Để thực sự sao chép danh sách, bạn có một số tùy chọn. .
Bạn có thể sử dụng danh sách dựng sẵn. copy() (có sẵn từ Python 3. 3). new_list = old_list. sao chép()
bạn có thể cắt nó. new_list = old_list[. ]
Bạn có thể sử dụng bản sao chung. sao chép(). nhập bản sao new_list = bản sao. bản sao (old_list)