Rumah > Artikel > pembangunan bahagian belakang > Mengapakah operator \'is\' berkelakuan berbeza dengan integer bukan cache di dalam dan di luar fungsi dalam Python?
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)
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?
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.
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
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
Kami melihat bahawa setiap objek kod mempunyai contoh 1000, yang membawa kepada penilaian Palsu.
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!