Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Soalan lazim temu bual Python: Perbezaan antara jenis data boleh ubah dan jenis data tidak berubah

Soalan lazim temu bual Python: Perbezaan antara jenis data boleh ubah dan jenis data tidak berubah

WBOY
WBOYke hadapan
2023-05-19 16:04:061148semak imbas

Python 面试高频问题:可变数据类型和不可变数据类型的区别

Jenis data pembolehubah Python dan jenis data tidak berubah ialah titik ujian asas dan penting. Ringkasnya: pembolehubah di sini adalah berubah-ubah dan tidak berubah dan merujuk kepada sama ada alamat data akan berubah apabila pembolehubah berubah!

Jenis data pembolehubah: Jika nilai pembolehubah diubah, ia bersamaan dengan mencipta objek baharu (iaitu, alamat akan ditukar).

Jenis data boleh ubah: Nilai pembolehubah berubah, tetapi alamat objek tidak berubah.

Jenis data tidak berubah: tuple, rentetan, nilai angka.

Jenis data boleh ubah: kamus, senarai, set.

Rujukan

Sebelum bercakap tentang jenis data boleh ubah dan jenis data tidak boleh ubah, kita perlu bercakap tentang konsep rujukan. Pembolehubah Python menyimpan rujukan kepada objek, yang menunjuk ke objek dalam ingatan timbunan Objek yang diperuntukkan dalam timbunan dibahagikan kepada dua kategori, satu objek boleh ubah, dan satu lagi objek tidak berubah. Contohnya: s1="abc".

Sebenarnya, pembolehubah s1 adalah rujukan kepada objek abc s1 menuju ke alamat memori tempat abc disimpan Jika anda ingin melihat nilai alamat s1, anda boleh menggunakan id fungsi, yang akan menukar nilai alamat kepada perpuluhan. Hanya gunakan print(id(s1)), seperti yang ditunjukkan dalam rajah di bawah:

Python 面试高频问题:可变数据类型和不可变数据类型的区别

Jenis data tidak berubah

Mari kita ambil rentetan sebagai contoh dan pergi terus kepada kod :

s1="abc"
print(id(s1))
s1="xyz"
print(id(s1))

Output:

140712532603136
140712532603168

Dapat dilihat daripada output yang menukar nilai pembolehubah jenis rentetan juga akan menukar alamat.

Mari kita lihat contoh ini seterusnya, yang juga merupakan soalan yang sering timbul dalam temu bual bertulis.

#Berdasarkan kod di atas, tulis kod berikut:

s2=s1
print(id(s1))
print(id(s2))

Output:

743316570224
743316570224

Anda dapat melihat bahawa s2=s1 sebenarnya menunjuk ke alamat s2 dan s1 yang sama .

Mari kita teruskan dan tukar nilai s2.

s2="def"
print(id(s1))
print(s1)
print(id(s2))
print(s2)

Output:

879864758384
xyz
879889887984
def

Melihat perkara ini, kita dapat memahami mengapa menukar nilai s2 tidak menjejaskan nilai s1. Kerana s1 dan s2 menunjuk ke alamat yang berbeza, nilai s1 tidak diubah!

Jenis data boleh ubah

Mari kita ambil senarai sebagai contoh:

l = [1, 2, 3]
print(id(l))
l.remove(1) # 删除元素
print(id(l))
l.append(4) # 增加元素
print(id(l))
l[1] = '8' # 修改元素
print(id(l))

Output:

405927907912
405927907912
405927907912
405927907912

Anda boleh melihat operasi tambah, padam dan ubah suai pada senarai, dan alamat senarai Tiada perubahan, ia hanya mengubah nilai pembolehubah, tetapi tidak mencipta objek baharu, dan alamat objek yang dirujuk oleh pembolehubah tidak berubah.

Lihat contoh berikut, yang serupa dengan contoh tugasan rentetan sebelumnya.

l1=['a','b','c']
l2=l1
print(id(l1))
print(id(l2))
l2.append('d')
print("************")
print(id(l1))
print(l1)
print(id(l2))
print(l2)

Output:

838366483528
838366483528
************
838366483528
['a', 'b', 'c', 'd']
838366483528
['a', 'b', 'c', 'd']

Hasil output tidak akan diterangkan di sini, kerana alamat l1 dan l2 adalah sama, jadi ia akan mempengaruhi satu sama lain.

Salinan senarai

Sesetengah pelajar mungkin bertanya, jika anda ingin menyalin senarai seperti rentetan dan menjana dua senarai dengan nilai yang sama tetapi alamat yang berbeza, bagaimanakah anda harus melakukannya? Sebenarnya, intipati masalah ini adalah perbezaan antara tugasan langsung senarai (guna = untuk tugasan langsung) dan salinan (salinan dibahagikan kepada salinan cetek dan salinan dalam saya akan menulis artikel lain untuk memperkenalkan pengetahuan berkaitan salinan cetek). dan salinan dalam secara terperinci Sila teruskan memberi perhatian.

Di sini kami mula-mula memperkenalkan kaedah yang agak mudah untuk menyalin, menggunakan pembina list() Kodnya adalah seperti berikut:

l3=['x','y','z']
l4=list(l3)
print(id(l3))
print(id(l4))
l4.append('a')
print(l3)
print(l4)

Output:

831456302152
831480344136
['x', 'y', 'z']
['x', 'y', 'z', 'a']

Seperti yang anda lihat. daripada keputusan, Alamat l3 dan l4 adalah berbeza, jadi ia tidak akan menjejaskan satu sama lain. Kita juga boleh membuat dua senarai menunjuk ke objek senarai yang berbeza dengan menggunakan indeks, penjanaan senarai, copy(), dan lain-lain, yang saya tidak akan perkenalkan satu persatu di sini!

Atas ialah kandungan terperinci Soalan lazim temu bual Python: Perbezaan antara jenis data boleh ubah dan jenis data tidak berubah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam