Maison > Article > développement back-end > Quelle est la magie derrière l'opérateur 'is' de Python avec des chaînes ?
En Python, l'opérateur 'is' est couramment utilisé pour tester l'égalité des chaînes. Cependant, son implémentation se démarque des autres opérateurs d'égalité comme '__eq__'. Cet article explore les subtilités du fonctionnement de « is » dans Python.
Contrairement à « __eq__ », qui vérifie l'égalité du contenu, « is » évalue l'identité. Lorsqu'il s'agit de chaînes, cela signifie que « is » détermine si les deux chaînes occupent le même emplacement mémoire.
Le défi se pose lorsque l'on essaie d'imiter le comportement « is » dans des classes personnalisées. Définir une méthode '__is__' ne suffit pas, car Python attend une implémentation spécifique. Pour répondre aux attentes de Python, il est crucial de comprendre la nature de l'internement dans les chaînes.
L'internement implique de stocker des objets chaîne dans un cache central, garantissant que plusieurs références à la même chaîne pointent vers une seule instance partagée. Cette optimisation améliore les performances en réduisant la consommation de mémoire et en améliorant la vitesse.
En Python, les chaînes littérales comme « abc » sont automatiquement internées. Ainsi, (('abc' == 'abc') et ('abc' est 'abc')) sont évalués à True. Cependant, pour les chaînes personnalisées, l'internement doit être explicitement effectué.
L'exemple suivant illustre la différence entre 'is' et '__eq__' avec des chaînes internées et non internées :
<code class="python">>>> s = 'str' >>> s is 'str' True >>> class MyString: ... def __init__(self): ... self.s = 'string' ... def __eq__(self, s): ... return self.s == s ... >>> m = MyString() >>> m is 'string' False >>> sys.intern(m) is 'string' # After interning, 'is' returns True True</code>
Pour En résumé, « is » vérifie l'identité de l'objet en Python, en comparant les emplacements de mémoire. Pour les cordes, cela implique que le stage joue un rôle substantiel. Les chaînes internes partagent la même adresse mémoire, permettant à « is » de déterminer correctement l’égalité. Lors de l'implémentation de « is » dans des classes personnalisées, il est essentiel de s'assurer que l'internement est géré de manière appropriée pour reproduire le comportement de Python.
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!