Pourquoi Python chaînes immuable? Meilleures pratiques pour les utiliser
- quelles sont les raisons de la conception de rendre les cordes de Python immuables? Comment cela rend-il la programmation plus facile?
- je suis habitué aux chaînes mutables, comme celles de C. Comment puis-je programmer sans chaînes mutables? Existe-il des pratiques exemplaires?
6 réponses
quand vous recevez une corde, vous serez sûr qu'elle reste la même. Supposons que vous construisiez un Foo
comme ci-dessous avec un argument string, et que vous modifiiez ensuite la chaîne; alors le nom du Foo
changerait soudainement:
class Foo(object):
def __init__(self, name):
self.name = name
name = "Hello"
foo = Foo(name)
name[0] = "J"
avec des cordes mutables, il faut faire des copies tout le temps pour éviter que de mauvaises choses ne se produisent.
il permet également la commodité qu'un seul caractère n'est pas différent d'une chaîne de caractères de longueur Un, donc tous les opérateurs de chaîne s'appliquent aussi aux caractères.
et enfin, si les cordes n'étaient pas immuables, vous ne pourriez pas les utiliser de manière fiable comme des clés dans un dict
, car leur valeur de hachage pourrait changer soudainement.
comme pour la programmation avec des chaînes immuables, il suffit de s'habituer à les traiter de la même façon que vous traitez les nombres: comme valeurs , pas comme des objets. Changer la première lettre de name
serait
name = "J" + name[1:]
chaînes immuables simplifient considérablement l'allocation de mémoire par rapport aux chaînes C: vous ne devinez pas à une longueur et sur-allouer en espérant que vous sur-alloué assez.
ils sont plus sûrs: vous pouvez jamais avoir un dépassement de tampon comme vous pouvez en C.
il n'y a qu'un seul cas d'utilisation de chaîne mutable.
- remplaçant une sous-couche ou un seul caractère
tous autres cas d'utilisation de chaîne (concaténation, recherche, etc., etc.) la mutabilité n'a pas d'importance. Dans tous les autres cas, la mutabilité n'a pas d'importance.
si vous voulez remplacer un caractère ou un substrat en Python, vous créez simplement une nouvelle chaîne de caractères
x = x[:place] + replacement + x[place+1:]
C'est le seul code qui soit nouveau ou distinctif.
pour des raisons que je ne comprends pas, il semble important d'ajouter le suivant.
" il y a d'autres façons d'éviter un débordement de tampon de chaîne que des chaînes immuables."
pour les besoins de cette question (à propos de Python, spécifiquement) les chaînes immuables ont une agréable conséquence d'aucun débordement de tampon. Pour les autres langues, d'autres principes, règles et nuances s'appliquent.
- les objets immuables sont automatiquement threadsafe.
- vous constaterez que l'utilisation de cordes de Python est trivialement facile en comparaison de la douleur extrême associée aux cordes en C.
chaînes immuables peuvent être des clés dans les dictionnaires et les structures de données similaires, sans la nécessité de copier les chaînes. Il est plus facile de faire un enveloppement mutable autour d'une chaîne immuable que l'inverse.
chaînes immuables rend la programmation beaucoup plus facile, c'est pourquoi C# et Java les utilisent aussi.
si les chaînes avaient été mutables, vous ne seriez pas en mesure de faire confiance à une chaîne fournie de l'extérieur, car un appelant malveillant pourrait la changer en dessous de vous.
Cela rendrait également le multi-threading beaucoup plus difficile.
la plupart des langues ont des chaînes immuables. Cela inclut Java, Python, et C#. Habituellement, lorsque les chaînes sont concaténées, la langue attribue une chaîne entièrement nouvelle et copie le contenu des deux chaînes dans la nouvelle chaîne.
immutabilité ne tend à rendre la programmation plus facile. Surtout lorsqu'il s'agit d'un environnement multi-thread.