-1

Lors de la vérification de la liste de paramètres Python avec un seul argument, j'ai trouvé un comportement étrange avec print.Liste de paramètres Python avec un argument unique

>>> def hi(*x): 
...  print(x) 
... 
>>> hi() 
() 
>>> hi(1,2) 
(1, 2) 
>>> hi(1) 
(1,) 

Quelqu'un pourrait-il me expliquer ce que la virgule signifie dans le résultat de hi(1) (à savoir (1,))

+2

Cela signifie que la valeur imprimée est un tuple avec un seul élément à l'intérieur. – Rockybilly

Répondre

1

En fait, le comportement est seulement un peu « bizarre. » :-)

Votre paramètre x est préfixé d'une étoile, ce qui signifie que tous les arguments que vous passez à la fonction seront "regroupés" en un seul multiplet, et x sera ce tuple.

La valeur (1,) est la façon Python écrit un tuple d'une valeur, pour contraster avec (1), ce qui serait le nombre 1.

Voici un cas plus général:

def f(x, *y): 
    return "x is {} and y is {}".format(x, y) 

ici quelques pistes:

>>> f(1) 
'x is 1 and y is()' 
>>> f(1, 2) 
'x is 1 and y is (2,)' 
>>> f(1, 2, 3) 
'x is 1 and y is (2, 3)' 
>>> f(1, 2, 3, 4) 
'x is 1 and y is (2, 3, 4)' 

Remarquez comment le premier argument va à x et tous les arguments suivants sont emballés en t Le tuple y. Vous avez peut-être trouvé la façon dont Python représente les tuples avec 0 ou 1 composants un peu bizarre, mais il est logique quand vous réalisez que (1) doit être un nombre et donc il doit y avoir un moyen de représenter un tuple mono-élément. Python utilise simplement la virgule de fin comme une convention, c'est tout.

+0

J'ai accepté votre réponse à cause de l'explication 'Convention d'impression à un seul élément '. Il sera très agréable si vous pouviez expliquer pourquoi '(1)' est interprété comme un nombre '1' – transang

+1

Bien sûr, en général les parenthèses ne changent pas la signification d'une expression. Par exemple vous pouvez dire '4+ (1)' et ce sera 5, de la même façon '4 * (2-1)' serait 4. Parce que la convention est d'utiliser des parenthèses pour le regroupement de sous-expressions, le concepteur de Python J'ai pensé qu'il serait trop déroutant de surcharger le sens pour signifier à la fois des tuples de regroupement et des tuples à un seul élément. Python a aussi une fonction 'type'. En fait 'type ((2))' est 'int' et' type ((2,)) 'est' tuple'. Nous ne voulons pas d'ambiguïté, ce qui serait le cas si '(2)' était traité comme un tuple. –

+0

Merci beaucoup pour la réponse détaillée. Je viens de créer [nouvelle réponse] (http://stackoverflow.com/questions/40710455/why-single-element-tuple-is-interpreted-as-that-element-in-python). Permettez-moi de lier la réponse à votre commentaire ici – transang