web-dev-qa-db-fra.com

python + = la concaténation de chaînes est-elle une mauvaise pratique?

Je lis Guide de l’auto-stoppeur en Python et un extrait de code court

foo = 'foo'
bar = 'bar'

foobar = foo + bar  # This is good
foo += 'ooo'  # This is bad, instead you should do:
foo = ''.join([foo, 'ooo'])

L'auteur a souligné que ''.join() n'est pas toujours plus rapide que +, Il n'est donc pas contre l'utilisation de + Pour la concaténation de chaînes.

Mais pourquoi foo += 'ooo' Est-il une mauvaise pratique alors que foobar=foo+bar Est considéré comme bon?

  • est-ce que foo += bar est bon?
  • est-ce que foo = foo + 'ooo' est bon?

Avant cet extrait de code, l'auteur écrivait:

Une dernière chose à mentionner à propos des chaînes est que l’utilisation de join () n’est pas toujours préférable. Dans les cas où vous créez une nouvelle chaîne à partir d'un nombre prédéterminé de chaînes, l'utilisation de l'opérateur d'addition est en réalité plus rapide, mais dans les cas comme ci-dessus ou dans les cas où vous ajoutez une chaîne existante, utilisez join () devrait être votre méthode préférée.

27
nos

Est-ce une mauvaise pratique?

Il est raisonnable de supposer que ce n'est pas une mauvaise pratique pour cet exemple car:

  • L'auteur ne donne aucune raison. Peut-être que c'est juste qu'il/elle n'aime pas.
  • La documentation Python ne mentionne pas que c'est une mauvaise pratique (d'après ce que j'ai vu).
  • foo += 'ooo' Est tout aussi lisible (selon moi) et est environ 100 fois plus rapide que foo = ''.join([foo, 'ooo']).

Quand faut-il utiliser l'un sur l'autre?

La concaténation de chaînes a l'inconvénient de devoir créer une nouvelle chaîne et allouer une nouvelle mémoire pour chaque concaténation! Cela prend beaucoup de temps, mais ce n’est pas un gros problème avec peu de petites chaînes. Lorsque vous connaissez le nombre de chaînes à concaténer et n'avez pas besoin de plus de 2 à 4 concaténations, je le ferais.


Lorsque vous joignez des chaînes Python ne doit allouer qu'une nouvelle mémoire pour la chaîne finale, ce qui est beaucoup plus efficace, mais peut prendre plus de temps à calculer. De plus, comme les chaînes sont immuables, il est souvent plus pratique d'utiliser un liste de chaînes à muter de manière dynamique et ne la convertit en chaîne que lorsque cela est nécessaire.

Il est souvent pratique de créer des chaînes avec str.join () car cela prend un itérable. Par exemple:

letters = ", ".join("abcdefghij")

De conclure

Dans la plupart des cas, il est plus logique d’utiliser str.join(), mais il arrive que la concaténation soit tout aussi viable. Utiliser n'importe quelle forme de concaténation de chaînes pour des chaînes énormes ou multiples serait une mauvaise pratique, tout comme utiliser str.join() serait une mauvaise pratique pour des chaînes courtes et peu nombreuses, à mon avis.

Je crois que l'auteur essayait juste de créer une règle empirique pour identifier plus facilement quand utiliser quoi que ce soit sans donner trop de détails ni rendre les choses plus compliquées.

41
Ted Klein Bergman