Bien que Python maintienne un cache d'entiers pour les valeurs comprises entre -5 et 256, ce cache n'affecte pas directement les comparaisons d'entiers dans code compilé.
Dans le code compilé, le compilateur analyse les littéraux ensemble, fusionnant des valeurs constantes égales en un seul objet pour optimiser l’utilisation de la mémoire. Ce comportement s'applique non seulement aux entiers mais également aux flottants.
Considérez les exemples suivants :
# Interactive >>> a = 257 >>> b = 257 >>> a is b False
Dans l'interpréteur interactif, chaque ligne est analysée et compilée séparément. Ainsi, a et b font référence à des PyInt_Objects distincts malgré leur valeur équivalente.
# Compiled $ echo 'a = 257 > b = 257 > print a is b' > test.py $ python test.py True
Lors de la compilation du code à partir d'un fichier, le compilateur analyse l'intégralité du code et peut fusionner des littéraux identiques. Cela signifie que a et b dans cet exemple pointeront vers le même PyInt_Object, ce qui donnera True pour la comparaison is.
Le processus d'optimisation du compilateur est effectué par la fonction compiler_add_o, qui utilise un dictionnaire pour stocker les constantes. Les constantes identiques occuperont le même emplacement dans le dictionnaire, conduisant à un seul objet constante dans le bytecode compilé.
Le comportement de fusion du compilateur ne s'applique pas aux littéraux complexes comme les tuples ou des listes. Bien que les éléments contenus puissent être fusionnés, les littéraux eux-mêmes resteront des objets distincts.
>>> a = (257, 258) >>> b = (257, 258) >>> a is b False >>> a[0] is b[0] True
Le compilateur de Python effectue des optimisations importantes pour réduire l'utilisation de la mémoire, notamment en fusionnant des constantes identiques dans le code compilé. Bien que le cache d'entiers lui-même n'ait pas d'impact direct sur ces optimisations, les comparaisons d'entiers impliquant des valeurs identiques se comporteront toujours comme prévu, avec des valeurs égales résultant en True pour les comparaisons is et ==.
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!