2016-11-09 4 views
0

Ich habe einen Modul Code:Scopes in Python Module

X = 88 
def f(): 
    global X 
    X = 99 

und eine andere Datei, die dieses Modul verwendet:

from First import X,f 
X = 11 
f() 
print(X) 

Jetzt nach meinem Verständnis, da wir explizit Symbole x und f importieren sie sollte Teil des Namespace für importierende Module werden.

Und da die Funktion f das globale X ändert. Die Antwort sollte 99.

sein, aber das scheint nicht der Fall zu sein, da der Ausgang 11 ist

Bitte helfen Sie mir zu verstehen, warum?

Antwort

7

Mithilfe der from module import ...-Syntax erstellen Sie neue Namen, die an dieselben Objekte wie die Namen in den ursprünglichen Modulen gebunden sind. Diese Namen sind unabhängig.

Nach dem Import müssen Sie dies:

First.X ----\ 
      |--> 88 
another.X --/ 

Sie dann another.X gesetzt nur-11, so haben Sie diese:

First.X --------> 88 

another.X ------> 11 

und nachdem Sie f() nennen, haben Sie dies:

First.X --------> 99 

another.X ------> 11 

Sie könnten stattdessen nur das Modul importieren; dass bindet den Namen First an das Modul-Objekt zeigen:

import First 
first.X = 11 
first.f() 
print(first.X) 

Nun Code arbeitet auf First.X nur.

Sie möchten vielleicht lesen, wie Python names and objects work.

+0

Vielen Dank. Im Grunde bedeutet die Verwendung der from-Anweisung (von import *), dass wir nur die Objekte innerhalb des importierten Moduls verwenden können, ohne sie mit dem Modulnamen zu qualifizieren. Aber für alle praktischen Zwecke ist es das gleiche wie nur schreiben Import

+0

@SubhayanBhattacharya: 'von Modul-Import *' erstellt neue Namen in Ihrem Namespace für jeden Namen in 'Modul' verfügbar (was verfügbar ist, hängt von der' Modul .__ dir__' , oder '[Name für Name in Verzeichnis (Modul) wenn Name [0]! = '_']' wenn es kein 'Modul .__ Verzeichnis__' gibt. –

+0

@SubhayanBhattacharya: 'Importmodul' hingegen setzt nur den Namen' modul' in Ihrem Namensraum. Nichts mehr. Also nein, das ist nicht wahr, 'Importmodul' ist komplett anders als' vom Modulimport *'. –