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!

1
Varuna 15 avril 2018 à 22:11

4 réponses

Meilleure réponse

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. "*

0
Varuna 24 juil. 2018 à 05:17

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.

7
Jonathon Reinhart 15 avril 2018 à 19:19

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.

2
Serge 27 avril 2018 à 23:30

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.

1
rob 16 avril 2018 à 19:52