Saya ingin membuat salinan dict
dalam python. Sayangnya .deepcopy()
metode ini tidak ada untuk dict
. Bagaimana aku melakukan itu?
>>> my_dict = {'a': [1, 2, 3], 'b': [4, 5, 6]}
>>> my_copy = my_dict.deepcopy()
Traceback (most recent calll last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'deepcopy'
>>> my_copy = my_dict.copy()
>>> my_dict['a'][2] = 7
>>> my_copy['a'][2]
7
Baris terakhir seharusnya 3
.
Saya ingin modifikasi my_dict
itu tidak memengaruhi snapshot my_copy
.
Bagaimana aku melakukan itu? Solusinya harus kompatibel dengan Python 3.x.
python
python-3.x
Olivier Grégoire
sumber
sumber
Jawaban:
Bagaimana tentang:
Python 2 atau 3:
sumber
copy.deepcopy
bukan thread aman. Belajar ini dengan cara yang sulit. Di sisi lain, tergantung pada kasus penggunaan Anda,json.loads(json.dumps(d))
adalah benang aman, dan bekerja dengan baik.json.loads
tidak menyelesaikan masalah untuk semua kasus penggunaan di manadict
atribut python tidak JSON serializable. Ini mungkin membantu mereka yang hanya berurusan dengan struktur data sederhana, dari API misalnya, tapi saya rasa itu tidak cukup solusi untuk sepenuhnya menjawab pertanyaan OP.dict.copy () adalah fungsi salin dangkal untuk
id kamus adalah fungsi bawaan yang memberi Anda alamat variabel
Pertama, Anda perlu memahami "mengapa masalah khusus ini terjadi?"
Alamat daftar yang ada di kedua dicts untuk kunci 'a' menunjuk ke lokasi yang sama.
Karenanya ketika Anda mengubah nilai daftar di my_dict, daftar di my_copy juga berubah.
Solusi untuk struktur data yang disebutkan dalam pertanyaan:
Atau Anda dapat menggunakan deepcopy seperti yang disebutkan di atas.
sumber
value[:]
. Solusinya adalah untuk struktur data tertentu yang disebutkan dalam pertanyaan daripada solusi universal.Python 3.x
dari copy impor impor
Tanpa deepcopy, saya tidak dapat menghapus kamus hostname dari dalam kamus domain saya.
Tanpa deepcopy saya mendapatkan kesalahan berikut:
... ketika saya mencoba untuk menghapus elemen yang diinginkan dari kamus saya di dalam kamus lain.
domain adalah objek kamus
Output contoh: [asli] domain = {'localdomain': {'localhost': {'all': '4000'}}}}
[baru] domain = {'localdomain': {}}}
Jadi apa yang terjadi di sini adalah saya mengulangi salinan kamus daripada beralih ke kamus itu sendiri. Dengan metode ini, Anda dapat menghapus elemen yang diperlukan.
sumber
Saya suka dan belajar banyak dari Lasse V. Karlsen. Saya memodifikasinya menjadi contoh berikut, yang menyoroti perbedaan antara salinan kamus dangkal dan salinan dalam:
Sekarang jika Anda berubah
dan lakukan
Anda mendapatkan
sumber
Solusi yang lebih sederhana (dalam pandangan saya) adalah membuat kamus baru dan memperbaruinya dengan isi yang lama:
Masalah dengan pendekatan ini adalah mungkin tidak cukup 'dalam'. yaitu tidak mendalam secara rekursif. cukup bagus untuk objek sederhana tetapi tidak untuk kamus bersarang. Berikut adalah contoh di mana itu mungkin tidak cukup dalam:
Dengan menggunakan Deepcopy () saya dapat menghilangkan perilaku semi-dangkal, tapi saya pikir orang harus memutuskan pendekatan mana yang tepat untuk aplikasi Anda. Dalam kebanyakan kasus Anda mungkin tidak peduli, tetapi harus menyadari kemungkinan jebakan ... contoh terakhir:
sumber
my_dict.copy()
!