2

Je viens d'apprendre de Why do list comprehensions write to the loop variable, but generators don't? que Liste compréhensions aussi « fuite » de leur variable de boucle dans le périmètre entourant.Liste des compréhensions laissent échapper leur variable boucle python2: comment rendre compatible avec python3

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> x = 'before' 
>>> a = [x for x in (1, 2, 3)] 
>>> x 
3 

Ce bug est corrigé dans Python3.

Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
>>> x = 'before' 
>>> a = [x for x in (1, 2, 3)] 
>>> x 
'before' 

Quelle est la meilleure façon de rendre Python2 compatible avec Python3 à ce stade?

+1

ne vous fiez pas au nom « fuite » ... Utiliser des noms uniques pour vos variables list-comp. – mgilson

+0

Utiliser une expression de générateur avec la liste –

Répondre

3

La meilleure façon est généralement de réutiliser tout simplement pas les noms de variables comme ça, mais si vous voulez quelque chose qui obtient le comportement Python 3 dans les deux 2 et 3:

list(x for x in (1, 2, 3)) 
2

@ commentaire de mgilson est probablement la vérité, mais si vous voulez écrire du code qui fonctionne dans les deux python2 et python3, vous pouvez envelopper une fonction de générateur en fonction de la liste, Exemple:

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> x = 'before' 
>>> a = list(x for x in (1, 2, 3)) 
>>> x 
'before' 
+0

Ce n'est pas la même chose –

+0

@PadraicCunningham: Pouvez-vous élaborer? –

+0

Lorsque j'exécute votre code en Python 2.7.11, 'a' devient' [ à 0x0000000009744900>] ', pas la liste désirée. –