Comportement inattendu de l'opérateur is avec des entiers non mis en cache
Question :
Dans une fonction, l'opérateur is renvoie Vrai lors de la comparaison de deux littéraux entiers en dehors de la plage de [-5, 256], mais Faux lorsque cela est effectué en dehors de la fonction. Pourquoi cette incohérence se produit-elle ?
Réponse :
tl;dr :
L'interpréteur Python exécute les blocs de code sous forme d'unités . Les fonctions sont des blocs uniques, tandis que les commandes interactives sont des blocs séparés. Chaque bloc contient ses propres objets, notamment des entiers. Ainsi, les entiers déclarés au sein d'une fonction pointent vers le même objet, alors que ceux déclarés à l'extérieur ne le font pas.
Élaboration :
-
Fonction :
- Le bloc de code est défini dans la fonction.
- Les littéraux dans le bloc (par exemple, 1000) sont stockés comme un seul objet.
- est vérifie l'identité de l'objet, donc a est b dans la fonction renvoie True car a et b pointent tous deux vers le même objet.
-
Commandes interactives :
- Chaque commande est exécutée comme un bloc de code distinct.
- Les littéraux dans chaque bloc sont stockés en tant qu'objets séparés.
- est vérifie l'identité de l'objet, et depuis les objets pour les littéraux sont différents, a is b renvoie False.
Observations supplémentaires :
- Ce comportement est vrai pour les nombres non entiers littéraux (par exemple, les littéraux flottants).
- Python utilise un dictionnaire pour stocker les constantes dans les objets de code et vérifie les constantes existantes avant d'en ajouter de nouvelles.
Avertissements :
-
Déclarations chaînées : Lorsque les commandes sont chaînées (par exemple, a = b = 1000), elles sont interprétées comme un seul bloc de code, menant à True.
-
Exécution au niveau du module : L'exécution au niveau du module (par exemple, a = b = 1000) se produit dans un seul bloc de code, ce qui donne True.
-
Objets mutables : L'incohérence ne s'applique pas aux objets mutables ; a = b = [] donnera toujours False.
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!