2017-10-11 2 views
3

Ich stieß auf eine Situation, die ich nicht verstehe. Ich habe drei Dateien:Importieren von globalen Variablen in Python auf zwei Arten

one.py (runnable):

import two 
import three 

three.init() 
two.show() 

two.py:

import three 

def show(): 
    print(three.test) 

three.py:

test = 0 

def init(): 
    global test 
    test = 1 

Das Ergebnis 1 ist, wie ich erwartet habe. Jetzt ändern wir zwei. Py:

from three import test 

def show(): 
    print(test) 

Das Ergebnis ist 0. Warum?

+1

wegen dieser 'aus drei Import test' .. Im zweiten two.py importieren Sie nur "test", was in three.py gleich "0" ist. –

+3

Um es kurz zu machen: Im zweiten Fall wird 'test' lokal für' two.py', so dass das erneute Binden von 'three.test' keinen Einfluss auf' two.test' hat (dies sind zwei verschiedene Namen). Für eine detaillierte Erklärung, lesen Sie dies: https://nedbatchelder.com/text/names.html –

Antwort

1

Es geht um Umfang. Wenn Sie Ihre one.py wie folgt ändern, würden Sie besser sehen.

import three 
from three import test 

three.init() 

print(test) 
print(three.test) 

wird es drucken:

0  <== test was imported before init() 
1  <== three.test fetches the current value 

Wenn Sie nur Variable importieren wird es eine lokale Variable erstellen, die eine unveränderliche ganze Zahl ist.

Aber wenn Sie Reihenfolge der Import-Anweisung ändern wie folgt Sie ein anderes Ergebnis erhalten würde:

import three 

three.init() 
print(three.test) 

from three import test 
print(test) 

es druckt:

1  <== three.test fetches the current value 
1  <== test was imported after init() 
+1

"Wenn Sie nur eine Variable importieren, wird es anders kompiliert werden." => Das hat mit der Kompilierung absolut nichts zu tun, all das passiert zur Laufzeit. –

+0

Danke für Ihren Kommentar, ich habe diese Aussage behoben. – scriptmonster

Verwandte Themen