2017-10-03 1 views
1
stu_dict = [{raw_input():int(raw_input())} for i in xrange(1)] 
print stu_dict 

Pour le code ci-dessus, l'entrée devrait être comme suit: 4 et r et imprime comme [{'r': 4}], cela signifie qu'il prend 4 en tant que valeur et r comme clé ici!Pourquoi raw_input prend-il de la valeur en premier?

Mais le code ci-dessous, il est entrée inverse, le premier sera affecté à la clé, et la seconde à valoriser

a = [[raw_input(), float(raw_input())] for i in xrange(int(raw_input()))] 
print a 

Pourquoi est-il?

+1

valeurs sont évaluées avant que les clés dans un 'dict',' list's sont évalués de gauche à droite –

+1

@Chris_Rands Nope. Pas en Python> = 3.5. Par la spécification, les clés * doivent être évaluées avant les valeurs *, mais il y avait un bug en suspens: https://bugs.python.org/issue11205 –

+1

@ juanpa.arrivillaga ils utilisent 2.7 –

Répondre

0

Il apparaît dans Python 2, pour chaque paire clé/donnée, la donnée est évaluée en premier, puis la séquence de paires, le cas échéant, est évaluée de gauche à droite.

Cependant, ce n'est pas le cas dans Python> = 3.5 où le bogue a été corrigé et les clés sont évaluées en premier.

Vous pouvez forcer le comportement prévu par la construction de la dict d'une séquence de 2-tuples:

[dict([(raw_input(), int(raw_input()))]) for i in xrange(1)] 
+1

C'est compliqué. Dans les anciennes versions de Python 2, cela fonctionnait "correctement" (c'est-à-dire selon la spécification), alors le bug a été introduit en 2.5. Voir [ce numéro] (https://bugs.python.org/issue11205). Cela fonctionne mal dans 3.3, et 3.4, je crois, mais a été corrigé dans Python 3.5 –

+0

@ juanpa.arrivillaga Oh, merci pour cela. –

+0

Le comportement des listes de compréhension n'est pas non plus ce que l'on pourrait attendre de la spécification, voir [cette question] (https://stackoverflow.com/questions/42201932/order-of-operations-in-a-dictionary-crehrehension) –

0

Python évalue les expressions de gauche à droite. Notez que lors de l'évaluation d'une affectation, le côté droit est évalué avant le côté gauche.

Tout simplement c'est un bug dans Python 2.7.

(Dans python3 était le même bug, mais maintenant il est déjà fixé.)