Je suis curieux de savoir pourquoi en Python, une virgule de fin dans une liste est une syntaxe valide, et il semble que Python l'ignore simplement:
>>> ['a','b',]
['a', 'b']
Cela a du sens quand c'est un tuple depuis ('a')
et qu'il ('a',)
y a deux choses différentes, mais dans des listes?
Réponses:
Les principaux avantages sont qu'il facilite la modification des listes multilignes et réduit l'encombrement des différences.
En changeant:
à:
n'implique qu'un changement d'une ligne dans le diff:
Cela bat le différentiel multiligne plus déroutant lorsque la virgule de fin a été omise:
Cette dernière différence rend plus difficile de voir qu'une seule ligne a été ajoutée et que l'autre ligne n'a pas changé de contenu.
Cela réduit également le risque de faire cela:
et déclencher une concaténation littérale de chaîne implicite , produisant
s = ['manny', 'mo', 'jackroger']
au lieu du résultat prévu.la source
List = "[" {Item ","} "]".
vs.List = "[" ({Item","}Item|)"]".
"\"item\","
pour chaque élément que d'imprimer"\"item\""
pour chaque élément suivi de","
pour tous sauf le dernier élément.C'est une convention syntaxique courante d'autoriser les virgules de fin dans un tableau, des langages comme C et Java le permettent, et Python semble avoir adopté cette convention pour sa structure de données de liste. C'est particulièrement utile lors de la génération de code pour remplir une liste: il suffit de générer une séquence d'éléments et de virgules, pas besoin de considérer le dernier comme un cas particulier qui ne devrait pas avoir de virgule à la fin.
la source
Cela aide à éliminer un certain type de bogue. Il est parfois plus clair d'écrire des listes sur plusieurs lignes. Mais lors d'une maintenance ultérieure, vous souhaiterez peut-être réorganiser les éléments.
Mais si vous autorisez les virgules de fin et que vous les utilisez, vous pouvez facilement réorganiser les lignes sans introduire d'erreur.
la source
Un tuple est différent car il
('a')
est développé en utilisant la continuation implicite et()
s comme opérateur de précendance, alors que('a',)
fait référence à un tuple de longueur 1.Votre exemple original aurait été
tuple('a')
la source
('a'),
est une chaîne; mais mon point était que les virgules de fin dans les tuples sont significatives, mais dans les listes, elles ne semblent pas encore être Python les accepte.tuple('a')
est probablement un mauvais exemple, car en généraltuple(x)
et(x,)
ne sont pas la même chose.tuple('ab') != ('ab',)
.tuple('a') == ('a',)
seulement parce que'a'
c'est une chaîne de longueur 1.>>> ("a",) == ("a")
False>>> ("ab",) == ("ab")
False>>> ("ab", "bc",) == ("ab", "bc")
TrueLa raison principale est de rendre les différences moins compliquées. Par exemple, vous avez une liste:
et vous souhaitez y ajouter un autre élément. Ensuite, vous finirez par faire ceci:
ainsi, diff montrera que deux lignes ont été modifiées, en ajoutant d'abord ',' en ligne avec 'c' et en ajoutant 'd' à la dernière ligne.
Ainsi, python autorise la fin de ',' dans le dernier élément de la liste, pour éviter des différences supplémentaires qui peuvent prêter à confusion.
la source