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
Lepaskan: 2024-12-02 02:23:11
asal
907 orang telah melayarinya

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan