Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Operator Python \"is\" Berkelakuan Berbeza dengan Integer Besar dalam Blok Kod Berbeza?

Mengapa Operator Python \"is\" Berkelakuan Berbeza dengan Integer Besar dalam Blok Kod Berbeza?

Susan Sarandon
Susan Sarandonasal
2024-11-01 15:26:31328semak imbas

Why Does Python's

Gelagat Operator "is" Python dengan Integer Besar

Isu

Dalam Python, operator is menyemak identiti objek dan bukannya kesetaraan. Walau bagaimanapun, dalam senario tertentu, tingkah laku ini boleh berlaku di luar jangkaan, seperti yang ditunjukkan di bawah:

<code class="python">def func():
    a = 1000
    b = 1000
    return a is b

a = 1000
b = 1000

print(a is b, func())  # (False, True)</code>

Perbandingan is mengembalikan Benar dalam fungsi, tetapi Salah di luarnya. Walaupun keputusan penilaian berbeza, integer a dan b nampaknya mempunyai nilai yang sama.

Penjelasan

Untuk memahami tingkah laku ini, tafsiran penterjemah Python tentang blok kod adalah penting. Menurut manual rujukan Python, setiap arahan yang dilaksanakan secara interaktif membentuk blok kod yang berasingan. Yang berikut dianggap sebagai blok:

  • Modul
  • Badan fungsi
  • Takrifan kelas

Dalam satu blok kod, Python menyimpan cache tertentu objek, seperti integer kecil (dalam julat [-5, 256]). Apabila berbilang pembolehubah merujuk kepada literal integer yang sama, mereka semua akan merujuk kepada objek integer cache yang sama. Walau bagaimanapun, jika literal diisytiharkan dalam blok kod yang berbeza, objek integer berbeza akan dibuat.

Objek Kod Berbeza, Identiti Berbeza

Untuk menggambarkan ini, pertimbangkan objek kod bagi setiap kes:

  • Fungsi fungsi: a dan b merujuk kepada objek integer yang sama (dicache oleh Python kerana 1000 berada dalam julat integer cache).
  • Interaktif arahan: a dan b merujuk kepada objek integer yang berbeza kerana ia ditakrifkan dalam blok kod yang berasingan.

Akibatnya, a ialah b menilai kepada True dalam blok fungsi, dengan semua integer adalah dicache dan False di luar blok, di mana objek berasingan dicipta.

Kaveat

Perhatikan kaveat berikut:

  • Merangkai pernyataan tugasan dalam satu baris boleh menyebabkan dalam semakan identiti Benar.
  • Pelaksanaan peringkat modul akan mengembalikan Benar kerana blok kod tunggal untuk modul.
  • Ujian yang melibatkan objek boleh ubah akan sentiasa mengembalikan Palsu kerana ia tidak dicache.

Kesimpulan

Memahami konsep blok kod dalam Python adalah penting untuk mentafsir tingkah laku yang tidak dijangka yang melibatkan perbandingan identiti. Walaupun is berguna untuk menyemak identiti objek tidak berubah, adalah disyorkan untuk menggunakan operator kesamaan (==) untuk membandingkan nilai, kerana ia tidak bergantung pada caching.

Atas ialah kandungan terperinci Mengapa Operator Python \"is\" Berkelakuan Berbeza dengan Integer Besar dalam Blok Kod Berbeza?. 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