Ketidakbolehubahan Python untuk rentetan membayangkan bahawa ia tidak boleh diubah setelah dicipta. Walau bagaimanapun, identiti objek, yang diwakili oleh fungsi id(), boleh berubah untuk rentetan, yang membawa kepada kekeliruan.
Secara umum, id() rentetan berubah setiap kali ia dipanggil, walaupun untuk rentetan literal yang sama. Ini kerana Python tidak menjamin untuk melatih semua rentetan secara lalai.
id('so') 140614155123888 id('so') 140614155123848 id('so') 140614155123808
Walau bagaimanapun, terdapat pengecualian. Rentetan yang memenuhi kriteria berikut dimasukkan dan akan mengekalkan id():
Menetapkan rentetan kepada pembolehubah boleh mempengaruhi kelakuan id()nya. Apabila pembolehubah merujuk rentetan, Python mengoptimumkan prestasi dengan menyimpan nilai rentetan dalam ingatan sekali, menggunakan versi yang diinternet.
so = 'so' id('so') # Now references the same interned string as 'so' 140614155123728
Python secara dalaman menggunakan fungsi untuk rentetan intern dipanggil intern_string_constants(). Fungsi ini digunakan pada rentetan yang memenuhi kriteria yang dinyatakan sebelum ini (cth., 'hello' dalam contoh anda).
Pengkompil dan pengoptimum Python juga memainkan peranan dalam latihan. Fungsi kilang objek kod boleh melatih mana-mana rentetan yang boleh diwakili sebagai pengecam yang sah (mis., 'jadi' dalam contoh kedua anda). Selain itu, lubang intip atau pengoptimum AST boleh melipat ungkapan ringkas yang melibatkan pemalar, yang membawa kepada hasil yang diselitkan.
Walaupun rentetan Python tidak boleh diubah, id()nya boleh berubah, bergantung pada faktor seperti interning, skop pembolehubah dan tingkah laku pengoptimum. Interning membantu mengoptimumkan penggunaan dan prestasi memori, dan ia boleh menjadi berharga untuk memahami tingkah lakunya untuk mengelakkan kemungkinan kekeliruan.
Atas ialah kandungan terperinci Mengapakah `id()` Python Berubah untuk Rentetan Tidak Boleh Berubah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!