[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