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
DDDasal
2024-12-16 16:54:11451semak imbas

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))

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())

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()

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

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

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

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]

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!

Kenyataan:
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