Waktu ke waktu saya perlu deepcopy suatu objek dan kadang-kadang itu adalah objek kamus jadi saya menggunakan operator ** untuk menyalinnya dengan mudah tetapi saya selalu bertanya-tanya apakah deepcopy berbeda atau efisien dalam beberapa hal. Mana yang lebih efisien dalam hal jejak memori, waktu cpu, dan apakah deepcopy berulang seperti yang dilakukan operator **?

import copy
myObj = {"some": "data", "to": "copy"}

# With using unpacking operator.
newObj1 = {**myObj}

# With using `copy.deepcopy` function.
newObj2 = copy.deepcopy(myObj)
3
Guven Degirmenci 17 November 2020, 18:21

1 menjawab

Jawaban Terbaik

Hati-Hati; ada perbedaan besar ketika nilai kamus tersebut dapat diubah, dan ** tidak berperilaku sama dengan copy.deepcopy():

>>> import copy
>>> myObj = {"some": "data", "to": ["copy", "this"]}
>>> newObj1 = {**myObj}
>>> newObj2 = copy.deepcopy(myObj)
>>> myObj["to"][1] = "that"
>>> newObj1
{'some': 'data', 'to': ['copy', 'that']}
>>> newObj2
{'some': 'data', 'to': ['copy', 'this']}

Seperti yang ditunjukkan dalam PEP 448, menggunakan ** iterable membongkar lebih mirip dengan dict.copy() daripada copy.deepcopy().

1
Brad Solomon 17 November 2020, 15:33