3 votes

Comportement différent entre Python 2 et Python 3 de vars() dans la compréhension de liste

Je suis actuellement en train de convertir un script de Python 2 à Python 3. En le déboguant, je suis tombé sur une partie du code qui se comporte différemment entre les deux versions. Cependant, je ne peux pas expliquer cette différence.

Voici un reproducer:

variable_1 = "x"
variable_2 = "y"
list_of_variables = ['variable_1', 'variable_2']
existing_variables = vars()

print([variable for variable in list_of_variables if variable in vars()])
print([variable for variable in list_of_variables if variable in existing_variables])

Python 2.7.18 affiche la sortie suivante:

['variable_1', 'variable_2']
['variable_1', 'variable_2']

Tandis que Python 3.9.0 affiche:

[]
['variable_1', 'variable_2']

Pourquoi la première compréhension de liste ne fonctionne pas en Python 3? Et pourquoi fonctionne-t-elle lorsqu'on stocke le contenu de vars() dans une variable?

10voto

chepner Points 54078

Ça fonctionne dans les deux cas: ça fonctionne juste différemment.

En Python 3, les compréhensions de liste créent leur propre portée locale pour éviter de laisser fuiter les noms de variables dans la portée d'appel. L'appel à vars() à l'intérieur de la compréhension de liste renvoie simplement les variables définies dans la propre portée de la compréhension de liste, et non la portée où la compréhension de liste est utilisée.

Depuis https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries:

Cependant, mis à part l'expression itérable dans la clause for la plus à gauche, la compréhension est exécutée dans une portée imbriquée implicitement séparée. Cela garantit que les noms attribués à dans la liste cible ne "fuient" pas dans la portée englobante.

0voto

Florin C. Points 99

En python 3, vars() agit comme locals(), ce qui signifie que vos locals() sont différents à l'intérieur de la compréhension de liste. https://docs.python.org/3/library/functions.html#vars

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