Mengapakah operator \'is\' berkelakuan berbeza dengan integer bukan cache di dalam dan di luar fungsi dalam Python?

Mary-Kate Olsen
Lepaskan: 2024-10-31 19:22:02
asal
332 orang telah melayarinya

Why does the 'is' operator behave differently with non-cached integers inside and outside a function in Python?

Kelakuan Tidak Dijangka Operator 'adalah' dengan Integer Bukan Cache

Siasatan

Semasa bereksperimen dengan penterjemah Python, paradoks telah diperhatikan mengenai ' ialah operator. Khususnya, 'is' mengembalikan True apabila dinilai dalam fungsi tetapi False apabila dinilai di luarnya:

>>> def func():
...     a = 1000
...     b = 1000
...     return a is b
...

>>> a = 1000
>>> b = 1000
>>> a is b, func()
(False, True)
Salin selepas log masuk

Memandangkan 'is' menilai 'id' objek, ini membayangkan bahawa dalam fungsi 'func', 'a' dan 'b' merujuk kepada contoh int yang sama. Walau bagaimanapun, di luar fungsi, mereka merujuk kepada objek yang berbeza. Mengapakah ini berlaku?

Penjelasan

Manual rujukan Python menawarkan penjelasan yang bernas:

"Blok ialah sekeping teks program Python yang dilaksanakan sebagai satu unit . Setiap arahan yang ditaip secara interaktif ialah blok."

Dalam fungsi, satu blok kod wujud, mengandungi hanya satu objek untuk nombor 1000. Oleh itu, 'id(a)' dan 'id(b)' mengembalikan nilai yang sama, menghasilkan penilaian Benar.

Di luar fungsi, kita mempunyai dua objek kod berasingan, masing-masing dengan objeknya untuk 1000. Oleh itu, 'id(a)' dan 'id(b) ' adalah berbeza, membawa kepada penilaian Palsu.

Keanehan ini bukan eksklusif untuk integer. Keputusan yang sama diperhatikan dengan, sebagai contoh, terapung literal. Ingat, membandingkan objek untuk identiti (menggunakan 'adalah') secara amnya tidak digalakkan; sebaliknya, pengendali kesaksamaan ('==') harus digunakan.

Demonstrasi Kod

Untuk mendapatkan pemahaman yang lebih jelas, kita boleh menyelidiki objek kod untuk kedua-dua kes:

Dalam Fungsi 'func':

>>> print(dis.code_info(func))
...
Constants:
   0: None
   1: 1000
Salin selepas log masuk

Kami mempunyai satu contoh 'int' untuk 1000 yang diperuntukkan kepada 'a' dan 'b'.

Di luar Fungsi 'Fungsi':

>>> com1 = compile("a=1000", filename="", mode="single")
>>> com2 = compile("b=1000", filename="", mode="single")
>>> id(com1.co_consts[0]) == id(com2.co_consts[0])
False
Salin selepas log masuk

Kami melihat bahawa setiap objek kod mempunyai contoh 1000, yang membawa kepada penilaian Palsu.

Nota

  • Pemerhatian ini berkaitan dengan CPython, pelaksanaan Python yang paling banyak digunakan.
  • Pernyataan berantai menilai kepada Benar untuk 'adalah' kerana ia dianggap sebagai blok kod tunggal.
  • Pelaksanaan pada peringkat modul juga menghasilkan Benar.
  • Semakan identiti menggunakan 'adalah' tidak disyorkan untuk objek boleh ubah, kerana ia akan sentiasa menilai kepada Salah.

Atas ialah kandungan terperinci Mengapakah operator \'is\' berkelakuan berbeza dengan integer bukan cache di dalam dan di luar fungsi dalam Python?. 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