2010-02-03 14 views
6

Je souhaite modifier la valeur d'un indice de chaîne particulière, mais malheureusementsurmonter les « inconvénients » de la chaîne immuabilité

string[4] = "a" 

pose un TypeError, parce que les chaînes sont immuables (« affectation de l'article ne sont pas pris en charge »).

Ainsi, au lieu-je utiliser la plutôt maladroite

string = string[:4] + "a" + string[4:] 

Y at-il une meilleure façon de le faire?

+0

Comment est le second maladroit? Il semble décrire très clairement le résultat. En outre, il semble insérer un caractère par opposition à remplacer un personnage (une capacité de votre premier exemple manque). Le premier repose sur certaines hypothèses concernant l'état "avant" et "après" de la chaîne. –

Répondre

8

Les chaînes en Python sont immuables, tout comme le nombre et tuples. Cela signifie que vous pouvez les créer, les déplacer, mais ne pas les modifier. Pourquoi cela est-il ainsi ? Pour quelques raisons (vous pouvez trouver une meilleure discussion en ligne):

  • De par leur conception, les chaînes en Python sont considérées comme élémentaires et non modifiables. Cela stimule mieux, des styles de programmation plus sûrs.
  • L'immutabilité des chaînes présente des avantages en termes d'efficacité, principalement dans le domaine des exigences de stockage plus faibles.
  • Il fait également des chaînes plus sûres Si vous regardez un peu autour du web Python à utiliser comme clés de dictionnaire

, vous remarquerez que les conseils les plus fréquents à « comment changer ma chaîne » est « la conception de votre code pour que vous n'ayez pas à le changer ". Assez juste, mais quelles sont les autres options? En voici quelques-unes:

  • nom = nom [: 2] + 'G' + nom [3:] - c'est une manière inefficace de faire le travail. La sémantique de la section Python garantit que cela fonctionne correctement dans tous les cas (tant que votre index est à portée), mais avec plusieurs copies de chaînes et concaténations, ce n'est pas vraiment la meilleure solution pour un code efficace. Bien que cela ne vous préoccupe pas (et vous ne le faites probablement pas), c'est une solution solide.
  • Utilisez la classe MutableString du module UserString. Bien qu'il ne soit pas plus efficace que la méthode précédente (il effectue le même tour sous le capot), il est plus cohérent syntaxiquement avec l'utilisation normale des cordes.
  • Utilisez une liste au lieu d'une chaîne pour stocker les données mutables. Convertir en avant et en arrière en utilisant la liste et joindre. En fonction de ce dont vous avez réellement besoin, ord et chr peuvent aussi vous être utiles.
  • Utilisez un objet tableau. C'est peut-être votre meilleure option si vous utilisez la chaîne pour contenir des données contraintes, telles que des octets binaires, et que vous voulez un code rapide.

plagiée my own page sur les idées Python :-)

3
mystring=list("abcdef") 
mystring[4]="Z" 
print ''.join(mystring) 
+0

Eww, '' .join() est assez méchant. –

+3

Pas vraiment. 'str.join()' est utile pour toutes sortes de choses, et c'est l'un d'entre eux. '' .join (...) 'est un idiome assez commun. –

+0

str.join est utile pour construire des chaînes, mais je ne pense pas que ce soit une bonne idée. Si vous remplacez seulement un personnage, ça va faire beaucoup plus de travail.Aussi, essayez 'a = list (u" か "* 1000000)'; cela utilise environ 40 Mo de mémoire sur mon système. Il vaut mieux def def_char (s, idx, c): retourner s [: idx] + c + s [idx:] 'sauf si vous en faites beaucoup en même temps. –

0
>>> from UserString import MutableString 
>>> s = MutableString('abcd') 
>>> s[2] = 'e' 
>>> print s 
abed 
+0

À partir des documents de la bibliothèque standard Python: Cette classe UserString de ce module est disponible pour la rétrocompatibilité uniquement. Si vous écrivez du code qui n'a pas besoin de travailler avec des versions de Python antérieures à Python 2.2, pensez à sous-classer directement à partir du type str intégré au lieu d'utiliser UserString (il n'y a pas d'équivalent à MutableString). –

+0

Des documents pour MutableString: "Mais le but de cette classe est éducatif: ... Une solution plus rapide et meilleure est de réécrire votre programme en utilisant des listes." http://pydoc.org/2.2.3/UserString.html – asveikau

+0

De plus, MutableString est obsolète dans 2.6 et supprimé dans 3.0. – jamessan