Saat membaca dokumentasi untuk dict.copy()
, dikatakan bahwa itu membuat salinan kamus yang dangkal. Hal yang sama berlaku untuk buku yang saya ikuti (Referensi Python Beazley), yang mengatakan:
Metode m.copy () membuat salinan dangkal dari item yang terkandung dalam objek pemetaan dan menempatkannya dalam objek pemetaan baru.
Pertimbangkan ini:
>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}
Jadi saya berasumsi ini akan memperbarui nilai original
(dan menambahkan 'c': 3) juga karena saya sedang melakukan salinan yang dangkal. Seperti jika Anda melakukannya untuk daftar:
>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Ini berfungsi seperti yang diharapkan.
Karena keduanya adalah salinan dangkal, mengapa itu dict.copy()
tidak berfungsi seperti yang saya harapkan? Atau pemahaman saya tentang menyalin dangkal vs dalam cacat?
python
dictionary
copy
pengguna225312
sumber
sumber
Jawaban:
Dengan "menyalin dangkal" itu berarti konten kamus tidak disalin oleh nilai, tetapi hanya membuat referensi baru.
Sebaliknya, salinan yang dalam akan menyalin semua konten berdasarkan nilai.
Begitu:
b = a
: Tugas referensi, Buata
danb
arahkan ke objek yang sama.b = a.copy()
: Menyalin dangkal,a
danb
akan menjadi dua objek yang terisolasi, tetapi isinya masih memiliki referensi yang samab = copy.deepcopy(a)
: Penyalinan dalam,a
danb
struktur dan konten menjadi sepenuhnya terisolasi.sumber
L
lagib
. Melakukannya akan menyederhanakan contoh.b[1][0] = 5
. Jikab
merupakan salinan dangkal, Anda baru saja berubaha[1][0]
.Ini bukan masalah salinan dalam atau salinan dangkal, tidak ada yang Anda lakukan adalah salinan dalam.
Sini:
Anda sedang membuat referensi baru ke daftar / dict yang dirujuk oleh aslinya.
di sini:
Anda sedang membuat daftar / dikt baru yang diisi dengan salinan referensi objek yang terkandung dalam wadah asli.
sumber
Ambil contoh ini:
Sekarang mari kita ubah nilai di level 'dangkal' (pertama):
Sekarang mari kita ubah nilai satu level lebih dalam:
sumber
no change in original, since ['a'] is an immutable integer
Ini. Ini sebenarnya menjawab pertanyaan yang diajukan.Menambahkan ke jawaban kennytm. Ketika Anda melakukan copy parent.copy dangkal () kamus baru dibuat dengan kunci yang sama, tetapi nilai-nilai tidak disalin mereka direferensikan. Jika Anda menambahkan nilai baru ke parent_copy itu tidak akan mempengaruhi orangtua karena parent_copy adalah kamus baru bukan referensi.
Nilai hash (id) dari parent [1] , parent_copy [1] identik yang menyiratkan [1,2,3] dari induk [1] dan parent_copy [1] disimpan di id 140690938288400.
Tetapi hash dari parent dan parent_copy berbeda yang menyiratkannya. Mereka adalah kamus yang berbeda dan parent_copy adalah kamus baru yang memiliki referensi nilai ke nilai parent
sumber
"baru" dan "asli" adalah dict yang berbeda, itu sebabnya Anda dapat memperbarui salah satunya saja .. Item tersebut disalin dangkal, bukan dict itu sendiri.
sumber
Konten disalin dangkal.
Jadi, jika dokumen asli
dict
berisi yanglist
laindictionary
, memodifikasi yang asli atau yang dangkal akan memodifikasinya (list
atau yangdict
) di yang lain.sumber
Di bagian kedua Anda, Anda harus menggunakan
new = original.copy()
.copy
dan=
hal-hal yang berbeda.sumber