[Python-de] Namens-Lookup in Comprehensions

Torsten Bronger bronger at physik.rwth-aachen.de
Sa Aug 6 09:19:14 CEST 2011


Hallöchen!

Stefan Behnel schreibt:

> Torsten Bronger, 06.08.2011 04:08:
>
>> Folgender Code:
>>
>> class Test(object):
>>      s = 2
>>      dict([(x, s) for x in range(10)])
>>      dict((x, s) for x in range(10))
>>
>> Warum bricht Python (zumindest CPython) die Ausführung der
>> letzten Zeile ab, weil er "s" nicht findet?
>>
>> CPython3 mag schon die Zeile davor nicht.  Ich weiß, daß Python3
>> dahingehend geändert wurde, daß "x" nicht mehr nach draußen
>> sichtbar ist, aber darum geht es hier ja nicht.
>>
>> Und überhaupt: Was ist der Grund, warum in solchen Ausdrücken der
>> Klassenvariablen-Namensraum quasi übersprungen wird und der
>> Interpreter gleich im umgebenden Namensraum sucht?
>
> Klassen haben in Python keinen Scope. Das hat erstmal auch nichts
> mit Generator-Expressions zu tun.

Danke für das Schlüsselwort "Scope".  Ich verstehe jetzt, warum das
passiert.  In einer Methode hätte mich das Verhalten auch nicht
gewundert.  Nur eine List-Comprehension sieht erstmal eher wie ein
Ausdruck denn eine Methode aus, außerdem ist ein *Namensraum* ja da:

#python3
class Test:
    s = 2
    x1 = 2 * s                        # funzt
    x2 = [x * s for x in range(10)]   # geht schief

Also ich verstehe die Gesetzmäßigkeit dahinter, finde es aber immer
noch ... schwer vermittelbar.  ;-)

Tschö,
Torsten.

-- 
Torsten Bronger    Jabber-ID: torsten.bronger at jabber.rwth-aachen.de
                                oder http://bronger-jmp.appspot.com


Mehr Informationen über die Mailingliste python-de