web-dev-qa-db-fra.com

Pourquoi les chaînes Python sont-elles immuables? Meilleures pratiques pour les utiliser

  1. Quelles sont les raisons de conception pour rendre les chaînes Python immuables? Comment cela facilite-t-il la programmation?
  2. Je suis habitué aux chaînes mutables, comme celles de C. Comment suis-je censé programmer sans chaînes mutables? Existe-t-il des meilleures pratiques?
47
Sergey

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:]
45
Fred Foo

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.

  • remplacement d'une sous-chaîne ou d'un seul caractère

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.

10
S.Lott
  1. Les objets immuables sont automatiquement threadsafe.
  2. Vous constaterez que l'utilisation de chaînes Python est très simple par rapport à la douleur extrême associée aux chaînes en C.
8
David Heffernan

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.

7
Rafał Dowgird

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.

3
SLaks

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.

3
Jack Edmonds