En Python, pourquoi ces deux 5 * ['th'] and [5 * ' th']
donnent-ils presque le même résultat? La question ici est de savoir pourquoi 5* ['th']
donne une liste cinq fois grande et non cinq listes.
>>>5 * ['th']
['th', 'th', 'th', 'th', 'th']
>>> [5 * 'th']
['ththththth']
Pour 5 * ['th'] le résultat attendu est 5 listes!
4 réponses
La question m'est apparue lorsque je parcourais un exemple de programme dans le livre de Magnus Lie Hetland, Beginning Python. Une partie de la réponse que j'ai reçue de Magnus lorsque je lui ai posé la même question se trouve ci-dessous.
* "La raison de traiter 5 * ['th'] de la manière qui produit le résultat ['th', 'th', 'th', 'th', 'th'] est de rendre la multiplication cohérente avec l'addition. Si vous multipliez un nombre par 5, vous obtenez un nombre cinq fois plus grand, et non cinq. De même, si vous multipliez une liste par 5, vous obtenez une liste cinq fois plus grande, pas cinq listes. "*
pourquoi ces ... donnent-ils presque le même résultat?
Ils ne le font pas.
5 * ['th']
Cela produira une liste avec un seul élément, 'th'
, puis le multipliera par 5. Le résultat est une liste avec 5 copies de cet élément:
['th', 'th', 'th', 'th', 'th']
La longueur de cette liste est de 5.
[5 * ' th']
Cela va concaténer la chaîne ' th'
cinq fois, produisant la chaîne ' th th th th th'
, puis créer une liste avec cette chaîne comme seul élément.
[' th th th th th']
La longueur de cette liste est de 1.
Parce que 1) les expressions originales sont presque les mêmes 2) la liste et la chaîne sont itérables et se comportent de manière très similaire en Python, donc la multiplication par un entier est très similaire pour la liste et la chaîne, dans le sens qui préserve le type d'origine du multiplicande, plutôt que de dire renvoie un tuple ou une liste d'éléments du type d'origine. Fait intéressant, trois des quatre opérateurs ariphmétiques de base retournent une valeur du même type que l'un des opérandes, bien qu'en Python 3 la division ait été redéfinie pour renvoyer float même si les arguments sont entiers.
L'objet list
définit ce qu'il pense être la multiplication par la façon dont il implémente ses méthodes list.__mul__
et list.__imul__
. Les implémenteurs de Python pensaient que copier le contenu N fois dans une seule nouvelle liste avait le plus de sens pour les listes.
Il y a une bonne raison à cela - ils voulaient que la multiplication fonctionne comme l'addition:
>>> ['th'] * 5
['th', 'th', 'th', 'th', 'th']
>>> ['th'] + ['th'] + ['th'] + ['th'] + ['th']
['th', 'th', 'th', 'th', 'th']
Si vous multipliez un nombre par 5, vous obtenez un nombre cinq fois plus grand, pas cinq. De même, si vous multipliez une liste par 5, vous obtenez une liste cinq fois grande, pas cinq listes.
Questions connexes
Questions liées
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.