Rumah > pembangunan bahagian belakang > Tutorial Python > Jenis Tidak Berubah lwn. Boleh Berubah: Bilakah Penetapan Nilai Bermaksud Pengubahsuaian Di Tempat?

Jenis Tidak Berubah lwn. Boleh Berubah: Bilakah Penetapan Nilai Bermaksud Pengubahsuaian Di Tempat?

DDD
Lepaskan: 2024-12-16 16:54:11
asal
446 orang telah melayarinya

Immutable vs. Mutable Types: When Does Value Assignment Mean In-Place Modification?

Jenis Kekal vs Boleh Berubah: Menjelaskan Konsep

Apabila bekerja dengan bahasa pengaturcaraan, memahami perbezaan antara jenis tidak berubah dan boleh berubah adalah penting. Contoh-contoh yang diberikan dalam pertanyaan menimbulkan persoalan mengenai konsep ini.

Apakah yang Membentuk Jenis Tidak Berubah?
Jenis tidak berubah ialah objek yang nilainya tidak boleh diubah suai setelah dicipta. Objek terapung sering dianggap tidak boleh diubah, seperti yang dilihat dalam contoh:

class RoundFloat(float):
    def __new__(cls, val):
        return float.__new__(cls, round(val, 2))
Salin selepas log masuk

Contoh ini mentakrifkan kelas yang memanjangkan jenis apungan. Walau bagaimanapun, kaedah baharu tidak mengubah suai nilai apungan asas yang ditubuhkan semasa penciptaan objek. Begitu juga, contoh:

class SortedKeyDict(dict):
    def __new__(cls, val):
        return dict.__new__(cls, val.clear())
Salin selepas log masuk

membuat kelas yang memanjangkan jenis dict, dengan baharu mengalih keluar semua kekunci daripada kamus apabila dibuat. Kedua-dua RoundFloat dan SortedKeyDict menunjukkan ketakbolehubah kerana kaedah baharu mereka tidak mengubah nilai asal.

Jenis Boleh Diubah: Pengubahsuaian Dalam Tempat
Sebaliknya, jenis boleh ubah membenarkan pengubahsuaian nilai di tempat. Contoh:

class SortedKeyDict_a(dict):
    def example(self):
        return self.keys()
Salin selepas log masuk

mentakrifkan kelas yang memanjangkan jenis dict dengan kaedah contoh mengembalikan senarai kunci. Walau bagaimanapun, dict tetap boleh berubah, seperti yang ditunjukkan oleh:

d = (('zheng-cai', 67), ('hui-jun', 68),('xin-yi', 2))
SortedKeyDict_a(d)  # Returns a dictionary without calling example
Salin selepas log masuk

Mutability: Value Assignment vs In-Place Modification
Gelagat jenis tidak berubah boleh mengelirukan, terutamanya apabila mempertimbangkan tugasan nilai:

x = 5.0
x += 7.0
print x # 12.0
Salin selepas log masuk

Dalam contoh ini, x ialah objek apungan, iaitu tidak berubah. Walau bagaimanapun, tugasan x = 7.0 nampaknya mengubah nilainya. Perbezaan utama di sini ialah nilai apungan asal bagi x diberikan nilai baharu, bukannya diubah suai di tempatnya.

Perbezaan ini juga digunakan pada jenis boleh ubah. Pertimbangkan contoh berikut:

s = 'foo'
s += 'bar'
print s # foobar
Salin selepas log masuk

Memandangkan s daripada jenis rentetan (tidak boleh ubah), ia mesti ditugaskan semula untuk memasukkan 'bar.' Pengubahsuaian di tempat boleh dibuat dengan jenis boleh ubah:

x = [1, 2, 3]
x += [3, 2, 1]
print x # [1, 2, 3, 3, 2, 1]
Salin selepas log masuk

Di sini, senarai x dilanjutkan dengan menambahkan senarai lain. Contoh-contoh ini menyerlahkan bahawa kebolehubahan jenis berkaitan dengan keupayaan pengubahsuaian di tempat.

Atas ialah kandungan terperinci Jenis Tidak Berubah lwn. Boleh Berubah: Bilakah Penetapan Nilai Bermaksud Pengubahsuaian Di Tempat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan