Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah `id()` Python Berubah untuk Rentetan Tidak Boleh Berubah?

Mengapakah `id()` Python Berubah untuk Rentetan Tidak Boleh Berubah?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-02 02:23:11966semak imbas

Why Does Python's `id()` Change for Immutable Strings?

Mutability dan Identiti Objek dalam Rentetan Python

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.

id() Gelagat untuk Rentetan

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

  • Pemalar yang disimpan dalam objek kod
  • String yang mengandungi hanya huruf ASCII, digit atau garis bawah

Skop Pembolehubah dan Interling

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

Sumber Gelagat Interning

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

Pelatihan dan Pengoptimuman

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.

Kesimpulan

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!

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