37 votes

Pourquoi a[ :]=1 est-il fondamentalement différent de a[ :]='1' ?

Veuillez considérer les deux extraits de code (remarquez la distinction entre chaîne et entier) :

a = []
a[:] = '1'

et

a = []
a[:] = 1

Dans le premier cas a es ['1'] . Dans la seconde, j'obtiens l'erreur TypeError: can only assign an iterable . Pourquoi utiliser '1' en 1 être fondamentalement différent ici ?

79voto

NPE Points 169956

L'affectation à une tranche nécessite un itérable sur le côté droit.

'1' est itérable, tandis que 1 ne l'est pas. Considérez ce qui suit :

In [7]: a=[]

In [8]: a[:]='abc'

Le résultat est :

In [9]: a
Out[9]: ['a', 'b', 'c']

Comme vous pouvez le voir, la liste devient chaque caractère de la chaîne de caractères comme un élément séparé. C'est une conséquence du fait qu'en itérant sur une chaîne de caractères, on obtient ses caractères.

Si vous souhaitez remplacer une série de a avec un seul scalaire, il suffit d'envelopper le scalaire dans une sorte d'itérable :

In [11]: a[:]=(1,) # single-element tuple

In [12]: a
Out[12]: [1]

Cela s'applique également aux chaînes de caractères (à condition que la chaîne soit traitée comme un élément unique et non comme une séquence de caractères) :

In [17]: a[:]=('abc',)

In [18]: a
Out[18]: ['abc']

2voto

guettli Points 3284

'1' est une chaîne, mais elle est itérable. C'est comme une liste de caractères. a[:]='1' remplace le contenu de la liste a avec le contenu de la chaîne '1' . Mais 1 est un nombre entier.

Python ne change pas le type.

Exemple :

print bool(1=='1') # --> False

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X