2

Ich habe gerade gelernt von Why do list comprehensions write to the loop variable, but generators don't?, dass List Comprehensions auch "leak" ihre Loop-Variable in den umliegenden Bereich.Liste Comprehensions leak ihre Schleife Variable in Python2: wie macht es kompatibel mit Python3

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

Dieser Fehler ist in Python3 behoben.

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

Was ist der beste Weg Python2 sein kompatibel mit Python3 an dieser Stelle zu machen?

+1

verlassen Sie sich nicht auf den Namen „undichten“ ... Verwenden Sie einen eindeutigen Namen für Ihre List-Comp-Variablen. – mgilson

+0

Verwenden Sie einen Generator Ausdruck mit der Liste –

Antwort

3

Der beste Weg, in der Regel nicht nur Variablennamen wie die Wiederverwendung ist, aber wenn Sie etwas, das die Python 3 Verhalten in den beiden 2 und 3 erhält:

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

@ mgilson Kommentar ist wohl die Wahrheit, aber wenn Sie Code schreiben möchten, die sowohl in python2 und python3 funktioniert, könnten Sie eine Generatorfunktion in einer Listenfunktion, Beispiel wickeln:

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

Dies ist nicht das gleiche –

+0

@PadraicCunningham: Können Sie das näher erläutern? –

+0

Wenn ich Ihren Code in Python 2.7.11 ausführen, wird 'a' zu' [ bei 0x0000000009744900>] ', nicht die gewünschte Liste. –