Warum lässt Python eine Variable in einem Bereich definieren, aber in einem anderen?

7

Ich sehe, dass es möglich ist, eine Variable innerhalb eines Bereichs zu definieren, sich dann aber außerhalb dieses Bereichs zu beziehen. Zum Beispiel funktioniert der folgende Code:

%Vor%

Das erscheint mir jedoch ein bisschen komisch. Wenn Sie dies in C versuchen würden, wäre die Variable X nicht richtig definiert:

%Vor%

Die Lösung, in C sowieso, ist X zuerst zu erklären, dann herausfinden, was damit zu tun:

%Vor%

Also, in Python ist mein Instinkt, Code wie folgt zu schreiben:

%Vor%

Allerdings ist mir klar, dass Python dies nicht verlangt. Irgendwelche Vorschläge? Gibt es für dieses Szenario eine Stilrichtlinie?

    
Stephen Gross 16.03.2011, 19:58
quelle

4 Antworten

17

Blöcke erstellen keinen neuen Bereich in Python. Module, Klassen und Funktionen tun dies.

Auch:

%Vor%

oder:

%Vor%     
Ignacio Vazquez-Abrams 16.03.2011 20:00
quelle
5

Mein Vorschlag:

Schreibe Python, nicht C.

In Python verwenden wir Blöcke. Ein if ist ein Block. Ein Block bedeutet nicht unbedingt einen anderen Bereich in Python.

    
orlp 16.03.2011 20:00
quelle
0

In Ihrem Beispiel könnten Sie Folgendes versuchen:

%Vor%

Warum Python nicht dieselben Scoping-Regeln wie C (und C ++ und Java) hat, lautet die kurze Antwort, dass es sich um verschiedene Sprachen handelt. Die lange Antwort hat mit Effizienz zu tun. In C werden diese Scoping-Regeln alle zur Kompilierungszeit behandelt, es gibt keinen Laufzeit-Overhead. In Python müsste es einen inneren Bereich in einem neuen dict speichern, und das würde zusätzlichen Aufwand verursachen. Ich bin mir sicher, dass es andere Gründe gibt, aber das ist ein großer praktischer.

    
dappawit 16.03.2011 20:05
quelle
0

Sie erstellen keinen neuen Bereich, daher gibt es kein Problem mit der Bereichsdefinition.

Beachten Sie jedoch, dass wenn Sie etwas tun wie:

%Vor%

Sie erhalten einen NameError, der ausgelöst wird, wenn foo False ist. Sie könnten also auf einen Fall stoßen, bei dem Sie Ihre Variable außerhalb der Bedingung definieren möchten (oder eine else hinzufügen, um sie zuzuweisen None .)

    
geoffspear 16.03.2011 20:05
quelle

Tags und Links