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 ?

Pourquoi l'opérateur \"is\" de Python se comporte-t-il différemment avec de grands entiers dans différents blocs de code ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-01 15:26:31328parcourir

Why Does Python's

Comportement de l'opérateur « is » de Python avec de grands entiers

Problème

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.

Explication

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 :

  • Modules
  • Corps de fonction
  • Définitions de classe

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.

Différents objets de code, différentes identités

Pour illustrer cela, considérons les objets de code pour chaque cas :

  • Fonction fonction : a et b font référence au même objet entier (mis en cache par Python puisque 1000 est dans la plage entière mise en cache).
  • Interactif commandes : a et b font référence à des objets entiers différents car ils sont définis dans des blocs de code séparés.

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.

Mises en garde

Notez les mises en garde suivantes :

  • Le chaînage des instructions d'affectation sur une seule ligne peut entraîner dans les vérifications d'identité True.
  • Les exécutions au niveau du module renverront True en raison du bloc de code unique pour un module.
  • Les tests impliquant des objets mutables renverront toujours False car ils ne sont pas mis en cache.

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn