Lorsque vous recevez une chaîne, vous serez sûr qu'elle reste la même. Supposons que vous construisiez un Foo
comme ci-dessous avec un argument de chaîne, puis que vous modifiez la chaîne; alors le nom de Foo
changerait soudainement:
class Foo(object):
def __init__(self, name):
self.name = name
name = "Hello"
foo = Foo(name)
name[0] = "J"
Avec des chaînes modifiables, vous devrez faire des copies tout le temps pour éviter que de mauvaises choses ne se produisent.
Cela permet également de convenir qu'un seul caractère n'est pas différent d'une chaîne de longueur un, donc tous les opérateurs de chaîne s'appliquent également aux caractères.
Et enfin, si les chaînes n'étaient pas immuables, vous ne pourriez pas les utiliser de manière fiable comme clés dans un dict
, car leur valeur de hachage pourrait changer soudainement.
Quant à la programmation avec des chaînes immuables, habituez-vous simplement à les traiter de la même manière que vous traitez les nombres: comme valeurs, pas comme des objets. Changer la première lettre de name
serait
name = "J" + name[1:]
Les chaînes immuables simplifient considérablement l'allocation de mémoire par rapport aux chaînes C: vous ne devinez pas une longueur et vous sur-allouez en espérant que vous allouez suffisamment.
Ils sont plus sûrs: vous pouvez jamais avoir un buffer dépassé comme vous le pouvez en C.
Il n'y a qu'un seul cas d'utilisation de chaîne modifiable.
Tous autres cas d'utilisation de chaînes (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 souhaitez remplacer un caractère ou une sous-chaîne en Python, vous créez simplement une nouvelle chaîne
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 ce qui suit.
"Il existe d'autres moyens d'éviter un débordement de tampon de chaîne que les chaînes immuables."
Aux fins de cette question (sur Python en particulier), les chaînes immuables ont une conséquence agréable de l'absence de débordements de tampon. Pour d'autres langues, d'autres principes, règles et nuances s'appliquent.
Les chaînes immuables peuvent être des clés dans les dictionnaires et les structures de données similaires, sans avoir besoin de copier les chaînes. Il est plus facile de créer un wrapper mutable autour d'une chaîne immuable que l'inverse.
Les chaînes immuables rendent la programmation beaucoup plus facile, c'est pourquoi C # et Java les utilisent également.
Si les chaînes avaient été mutables, vous ne pourriez pas faire confiance à une chaîne fournie en externe, car un appelant malveillant pourrait la modifier sous 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, lors de la concaténation de chaînes, le langage alloue une chaîne entièrement nouvelle et copie le contenu des deux chaînes dans la nouvelle chaîne.
L'immuabilité a tendance à faciliter la programmation. Surtout lorsqu'il s'agit d'un environnement multi-thread.