Hướng dẫn why do we use copy () in python? - tại sao chúng ta sử dụng bản sao () trong python?

Về cơ bản,

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
4 điểm
>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
5 đến bất cứ nơi nào
>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
6 điểm, và không có gì khác.

Những gì bạn đang hỏi là các loại có thể thay đổi. Số, chuỗi, bộ dữ liệu, đông lạnh, booleans,

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
7, là bất biến. Danh sách, từ điển, bộ, bytearrays, có thể thay đổi.

Nếu tôi tạo một loại có thể thay đổi, như

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
8:

>>> a = [1, 2]  # create an object in memory that points to 1 and 2, and point a at it
>>> b = a       # point b to wherever a points
>>> a[0] = 2    # change the object that a points to by pointing its first item at 2
>>> a
[2, 2]
>>> b
[2, 2]

Cả hai vẫn sẽ chỉ vào cùng một mục.

Tôi cũng sẽ bình luận về mã gốc của bạn:

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5

Bạn luôn có thể thấy nơi nào đó chỉ vào bộ nhớ bằng cách làm

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
9.

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5

Bạn sử dụng

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
0 khi bạn muốn tạo một bản sao của một cấu trúc. Tuy nhiên, nó vẫn sẽ không tạo ra một bản sao của một cái gì đó được thực tập. Điều này bao gồm các số nguyên nhỏ hơn
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
1,
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
2,
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
3,
>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
7, các chuỗi ngắn như
>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
6. Về cơ bản, bạn hầu như không bao giờ nên sử dụng nó trừ khi bạn chắc chắn rằng bạn sẽ không bị rối tung khi thực tập.still will not make a copy of something that is interned. This includes integers less than
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
1,
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
2,
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
3,
>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
7, short strings like
>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
6. Basically, you should almost never use it unless you're sure you won't be messed up by interning.

Hãy xem xét thêm một ví dụ, hiển thị ngay cả với các loại có thể thay đổi, chỉ một biến vào một cái gì đó mới vẫn không thay đổi biến cũ:

>>> a = [1, 2]
>>> b = a
>>> a = a[:1]    # copy the list a points to, starting with item 2, and point a at it
>>> b            # b still points to the original list
[1, 2]
>>> a
[1]
>>> id(b)
79367984
>>> id(a)
80533904

Cắt một danh sách (bất cứ khi nào bạn sử dụng

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
6) tạo một bản sao.

Trong các chương trình Python, nhiều lần chúng ta cần có một bản sao giống hệt nhau của một dữ liệu hiện có. Đối với các loại dữ liệu đơn giản như int, float, giá trị boolean hoặc chuỗi, một hoạt động gán thực hiện nhiệm vụ cho chúng tôi vì chúng là loại dữ liệu bất biến. Sau khi sao chép, khi chúng tôi thực hiện & nbsp; Bất kỳ thay đổi nào đối với bất kỳ biến nào với các loại dữ liệu bất biến, một thể hiện dữ liệu mới được tạo ra và chúng không ảnh hưởng đến dữ liệu gốc. Trong trường hợp các loại dữ liệu có thể thay đổi như danh sách hoặc từ điển, nếu chúng ta sử dụng toán tử gán để sao chép dữ liệu sang biến khác, cả hai biến đều tham chiếu đến cùng một đối tượng dữ liệu và nếu chúng ta thay đổi bất kỳ biến nào, đối tượng sẽ được thay đổi phản ánh Hiệu ứng trên cả hai biến. Trong bài viết này, chúng tôi sẽ cố gắng hiểu khái niệm bản sao này trong Python với các ví dụ.

Làm thế nào để có được ID đối tượng của một đối tượng trong Python?

Để minh họa khái niệm bản sao trong Python, chúng ta sẽ cần biết ID đối tượng của một đối tượng. Đối với nhiệm vụ này, chúng tôi sẽ sử dụng chức năng

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
7. Hàm này lấy tên biến làm đầu vào và trả về một ID duy nhất cho đối tượng. Điều này có thể được nhìn thấy từ ví dụ sau.

var1=1
print("ID of object at which var1 refers:",end=" ")
print(id(var1))

Output:

Hướng dẫn why do we use copy () in python? - tại sao chúng ta sử dụng bản sao () trong python?

ID of object at which var1 refers: 9784896

Sao chép một đối tượng bằng cách sử dụng = toán tử trong Python

Khi chúng tôi cố gắng sao chép một đối tượng bằng cách sử dụng = toán tử bằng cách gán một biến cho một biến khác, nó không tạo ra một đối tượng mới nhưng cả hai biến được gán cho cùng một đối tượng. & NBSP;

Ví dụ: nếu chúng ta có một biến có tên var1 đề cập đến một đối tượng và chúng ta gán var1 cho var2 cho câu lệnh

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
8, cả hai biến đều chỉ ra cùng một đối tượng và do đó sẽ có cùng một ID. Điều này có thể được nhìn thấy như sau.


var1=11
var2=var1
print("ID of object at which var1 refers:",end=" ")
print(id(var1))
print("ID of object at which var2 refers:", end=" ")
print(id(var2))

Output:

ID of object at which var1 refers: 9785216
ID of object at which var2 refers: 9785216

& nbsp; Đối với các đối tượng bất biến, khi chúng ta thay đổi giá trị được gán cho bất kỳ var1 hoặc var2 nào, một đối tượng mới được tạo cho giá trị mới được gán cho biến. Vì vậy, nếu chúng ta thay đổi giá trị được gán cho var2, một đối tượng mới sẽ được tạo và sau khi phân công lại, var1 và var2 sẽ đề cập đến các đối tượng có ID đối tượng khác nhau. Điều này có thể được hiểu như sau.

var1=11
var2=var1
print("ID of object at which var1 refers:",end=" ")
print(id(var1))
print("ID of object at which var2 refers:", end=" ")
print(id(var2))
print("After Assigning value to var2")
var2=10
print("ID of object at which var1 refers:",end=" ")
print(id(var1))
print("ID of object at which var2 refers:", end=" ")
print(id(var2))

Đầu ra:

ID of object at which var1 refers: 9785216
ID of object at which var2 refers: 9785216
After Assigning value to var2
ID of object at which var1 refers: 9785216
ID of object at which var2 refers: 9785184

Không giống như ở trên, nếu chúng ta đang sao chép các đối tượng có thể thay đổi như danh sách, chúng chỉ vào cùng một đối tượng sau khi phân công lại và sửa đổi bằng cách sử dụng bất kỳ biến nào dẫn đến thay đổi trong cùng một đối tượng. Điều này có thể được nhìn thấy như sau.

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
0

Output:

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
1

Trong đầu ra ở trên, chúng ta có thể thấy rằng khi chúng ta sử dụng toán tử gán để sao chép danh sách, cả hai biến List1 và List2 đều đề cập đến cùng một đối tượng và có cùng ID. Điều này không thay đổi khi chúng tôi thay đổi bất kỳ danh sách nào.

Làm thế nào để sao chép các đối tượng có thể thay đổi trong Python?

Để sao chép các đối tượng có thể thay đổi như danh sách hoặc từ điển, chúng tôi sử dụng phương thức

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
9.

Khi được gọi trên bất kỳ đối tượng nào, phương thức

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
9 tạo một đối tượng mới có cùng dữ liệu với đối tượng gốc và trả về một tham chiếu đến nó. Nó có nghĩa là khi chúng tôi sao chép & nbsp; Các đối tượng sử dụng phương thức
>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
9 thay vì = toán tử, địa chỉ của đối tượng gốc và đối tượng được sao chép là khác nhau.

Ví dụ: nếu chúng tôi sao chép List1 vào List2 bằng phương thức

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
9 thì List1 và List2 sẽ tham khảo các đối tượng khác nhau. Điều này có thể được nhìn thấy như sau.

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
2

Output:

>>>a=5     # '5' is interned, so it already exists, point a at it in memory
>>>b=a     # point b to wherever a points
>>>a=6     # '6' already exists in memory, point a at it
>>>print b # b still points at 5 because you never moved it
5
3

Trong đầu ra, có thể thấy rằng List2 có ID đối tượng khác với List1. Nếu chúng tôi sửa đổi bất kỳ giá trị nào trong List1, nó sẽ không gây ra bất kỳ thay đổi nào đối với List2 không phải là trường hợp khi chúng tôi sử dụng = toán tử để sao chép một đối tượng sang một đối tượng khác.

Sự kết luận

Trong bài viết này, chúng tôi đã nghiên cứu về cách sao chép các đối tượng có thể thay đổi và bất biến trong Python. Đối với các đối tượng bất biến, chúng ta có thể sử dụng = toán tử vì tại mỗi lần xác định lại, một đối tượng mới được tạo cho các đối tượng bất biến. Trong trường hợp các đối tượng có thể thay đổi như từ điển Python, chúng ta nên sử dụng phương thức

>>> id(5)
77519368
>>> a = 5
>>> id(a)
77519368     # the same as what id(5) showed us, 5 is interned
>>> b = a
>>> id(b)
77519368     # same again
>>> id(6)
77519356
>>> a = 6
>>> id(a)
77519356     # same as what id(6) showed us, 6 is interned
>>> id(b)
77519368     # still pointing at 5.    
>>> b
5
9 để sao chép một đối tượng như danh sách hoặc từ điển để tránh các lỗi không mong muốn trong chương trình. Làm cho các chương trình mạnh mẽ hơn và xử lý các lỗi một cách có hệ thống. Hãy theo dõi các bài viết nhiều thông tin hơn.

Khuyến nghị đào tạo Python

Khóa học: Python 3 cho người mới bắt đầu

Hơn 15 giờ nội dung video với hướng dẫn hướng dẫn cho người mới bắt đầu. Tìm hiểu làm thế nào để tạo các ứng dụng trong thế giới thực và làm chủ những điều cơ bản.