Maison  >  Article  >  développement back-end  >  Pourquoi l'opérateur « est » se comporte-t-il différemment avec les grands entiers à l'intérieur et à l'extérieur des fonctions en Python ?

Pourquoi l'opérateur « est » se comporte-t-il différemment avec les grands entiers à l'intérieur et à l'extérieur des fonctions en Python ?

DDD
DDDoriginal
2024-11-01 15:31:02827parcourir

Why does the `is` operator behave differently with large integers inside and outside functions in Python?

Le comportement inattendu de l'opérateur avec de grands entiers dans les fonctions


Lors de l'expérimentation avec l'interpréteur de Python, une curieuse divergence a été découverte concernant le est Operator.

Lorsque l'évaluation est effectuée au sein d'une fonction, elle renvoie True, mais lorsqu'elle est effectuée en externe, le résultat est False.

<br>def func():</p>
<pre class="brush:php;toolbar:false">a = 1000
b = 1000
return a is b

a = 1000
b = 1000
a est b, func()
>(False, True)

Puisque l'opérateur is évalue les identifiants de l'objet, cela indique que dans la fonction func, a et b font référence à la même instance entière, alors qu'en dehors de la fonction func fonction, ils font référence à des objets distincts.

Explication


Comme le note le manuel de référence :


Un bloc est un morceau de texte de programme Python qui est exécuté comme une unité.
Les blocs suivants sont : un module, un corps de fonction et une définition de classe.
Chaque commande saisie de manière interactive est un bloc.


D'où, dans une fonction, un unique le bloc de code contient un unique objet littéral numérique, tel que 1000, ce qui donne True pour id(a) == id(b).

< p>Dans le deuxième cas, des objets de code séparés existent, chacun avec son littéral numérique pour 1000, ce qui provoque id(a) != id(b).

< ;p>Il est important de noter que ce comportement n'est pas exclusif aux littéraux entiers ; des résultats comparables sont observés avec des littéraux flottants (cf. ici).

N'oubliez pas d'utiliser l'opérateur d'égalité (==) pour comparer des objets, jamais l'opérateur d'identité (is).

Cette connaissance concerne CPython, la principale implémentation de Python. Les implémentations alternatives peuvent présenter un comportement variable.

Code Analysis


Pour comprendre, vérifions ce comportement à l'aide du code. analyse d'objet.

Fonction de fonction :

Les objets de fonction ont un attribut code qui révèle le bytecode compilé . dis.code_info présente succinctement ces données :

<br>print(dis.code_info(func))<br>Nom : func<br>Nom du fichier : <stdin><br>Nombre d'arguments : 0<br>Arguments en kW uniquement : 0 <br>Nombre de locaux : 2<br>Taille de la pile : 2<br>Drapeaux : OPTIMIZED, NEWLOCALS, NOFREE<br>Constantes :<br> 0 : Aucun<br> 1 : 1000<br>Noms des variables :<br> 0 : a<br> 1 : b<br>

L'entrée Constantes montre que les constantes sont Aucune (toujours présente) et 1000. Ainsi, il y a une instance int représentant 1000. a et b font référence à cet objet.

Commandes interactives :

Chaque commande est un bloc de code analysé, compilé et évalué indépendamment :

<br>com1 = compile("a=1000", filename="", mode="single ")<br>com2 = compile("b=1000", filename="", mode="single")<br>

L'objet code pour chaque affectation semble similaire, mais essentiellement, com1 et com2 ont des instances int distinctes pour 1000, ce qui conduit à False pour id(com1.co_consts[0]) == id(com2.co_consts[0]).

Objets de code différents, contenus distincts.

Mises en garde

  • Déclarations enchaînées : Évaluation de a = 1000 ; b = 1000 donne une identité Vraie, puisque ces affectations enchaînées se compilent en un seul bloc de code, produisant une instance de 1000.


  • Niveau du module : L'exécution au niveau du module (indiquée par le manuel de référence) donne également True en raison d'un seul objet de code.


  • Objets mutables : Les contrôles d'identité échouent pour les objets mutables à moins qu'ils ne soient explicitement initialisés sur le même objet (par exemple, a = b = []).

  • 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