Maison > Article > développement back-end > Pourquoi l'opérateur \"is\" de Python se comporte-t-il différemment avec de grands entiers dans différents blocs de code ?
En Python, l'opérateur is vérifie l'identité de l'objet plutôt que l'équivalence. Cependant, dans certains scénarios, ce comportement peut être inattendu, comme démontré ci-dessous :
<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>
La comparaison is renvoie True dans la fonction, mais False en dehors. Malgré les résultats d'évaluation différents, les entiers a et b semblent avoir la même valeur.
Pour comprendre ce comportement, l'interprétation des blocs de code par l'interpréteur Python est cruciale. Selon le manuel de référence Python, chaque commande exécutée de manière interactive constitue un bloc de code distinct. Les éléments suivants sont considérés comme des blocs :
Au sein d'un seul bloc de code, Python met en cache certains des objets, tels que des petits entiers (dans la plage [-5, 256]). Lorsque plusieurs variables font référence au même littéral entier, elles feront toutes référence au même objet entier mis en cache. Cependant, si les littéraux sont déclarés dans différents blocs de code, des objets entiers distincts seront créés.
Pour illustrer cela, considérons les objets de code pour chaque cas :
En conséquence, a est b est évalué à True dans le bloc func, où tous les entiers sont mis en cache et False en dehors du bloc, où des objets séparés sont créés.
Notez les mises en garde suivantes :
Comprendre le concept de blocs de code en Python est essentiel pour interpréter un comportement inattendu impliquant des comparaisons d'identité. Bien que cela soit utile pour vérifier l'identité d'objets immuables, il est recommandé d'utiliser l'opérateur d'égalité (==) pour comparer les valeurs, car il ne repose pas sur la mise en cache.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!