Maison >développement back-end >Tutoriel Python >Pourquoi les ID de chaîne immuables semblent-ils changer dans Python 2.7 ?

Pourquoi les ID de chaîne immuables semblent-ils changer dans Python 2.7 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 16:22:18313parcourir

Why Do Immutable String IDs Appear to Change in Python 2.7?

Pourquoi l'ID d'une chaîne immuable change-t-il ?

Dans Python 2.7, le comportement des ID de chaîne peut être déroutant. Bien que les chaînes soient immuables, leurs identifiants semblent changer avec le temps. Cet article explore les raisons de ce comportement.

Id Interning en Python

CPython n'interne pas toutes les chaînes par défaut. Cependant, les chaînes qui répondent à certains critères peuvent être internées à l'aide de la fonction sys.intern() ou de l'appel intern_string_constants() de la fonction PyCode_New. L'internement garantit que plusieurs occurrences de la même chaîne dans la base de code utilisent le même objet.

Les chaînes admissibles à l'internement incluent :

  • Constantes stockées dans les objets de code
  • Chaînes contenant uniquement des lettres, des chiffres ou des traits de soulignement ASCII
  • Chaînes affectées à la fois à un identifiant et sa valeur (par exemple, so = 'so')

Modification des identifiants

Si une chaîne n'est pas admissible au stage, son identifiant continuera à changer. En effet, Python est libre de réutiliser les emplacements mémoire pour de nouvelles chaînes, ce qui conduit à des identifiants différents pour le même littéral.

Internement et utilisation des chaînes

Le comportement des identifiants dépend sur la façon dont la chaîne est utilisée :

  • Sans référence de variable : Si vous appelez id('so') plusieurs fois sans l'attribuer à une variable, l'ID peut changer car l'objet chaîne interne est supprimé.
  • Avec une référence de variable : Si vous attribuez une chaîne à une variable (par exemple, so = 'so'), l'ID restera le même car la chaîne interne est liée au variable.

Concaténation de chaînes

La concaténation de chaînes affecte également les identifiants. Les chaînes concaténées dans les limites de l'optimiseur peuvent conduire à des chaînes internées, ce qui donne le même ID pour la chaîne concaténée.

Conclusion

L'ID d'une chaîne immuable dans Python 2.7 est pas toujours le même en raison des mécanismes d’internement et de la réutilisation de la mémoire. Comprendre ces facteurs permet de clarifier l'incohérence apparente dans les identifiants de chaînes.

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