2012-06-12 18 views
6

Lets sagen, dass ich ein Python-Modell fibo.py wie unten definiert haben:Python: Import-Modul

#Fibonacci numbers module 
print "This is a statement" 
def fib(n): 
    a,b = 0,1 
    while b < n: 
     print b 
     a, b = b, a+b 

def fib2(n): 
    a,b = 0,1 
    result= [] 
    while(b < n): 
     result.append(b) 
     a, b = b, a+b 
    return result 

In meinem Dolmetscher Sitzung, ich folgendes:

>> import fibo 
This is a statement 
>>> fibo.fib(10) 
1 
1 
2 
3 
5 
8 

>>> fibo.fib2(10) 
[1, 1, 2, 3, 5, 8] 
>>> fibo.__name__ 
'fibo' 
>>> 

So weit so gut. .Restart der Interpreter:

>>> from fibo import fib,fib2 
This is a statement 
>>> fibo.__name__ 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'fibo' is not defined 
>>> 

Ich erwartete den Fehler, da ich nur fib und fib2 importiert habe. Aber ich verstehe nicht, warum die Aussage gedruckt wurde, als ich nur fib und fib2 importierte.

Zweitens, wenn ich das Modul wie ändern:

#Fibonacci numbers module 
print "This is a statement" 
print __name__ 

Was soll das erwartete Ergebnis sein?

+0

Sie könnten eine einzige Funktion mit 'yield b' verwenden: 1.' für f in fib (n): Ausdruck f' 2. 'Ergebnis = Liste (fib (n))' – jfs

Antwort

9

Dies ist das erwartete Verhalten. Beim Importieren mit from X import Y wird das Modul weiterhin geladen und ausgeführt, wie in der Language Reference dokumentiert. In der Tat, wenn Sie tun

from fibo import fib 
print("foo") 
import fibo 

drucken This is a statement, gefolgt von foo. Die zweite import druckt nichts, da das Modul bereits zwischengespeichert ist.

Ihr zweites Modul wird This is a statement gefolgt von fibo drucken. Das Modul kennt seinen eigenen Namen zum Zeitpunkt des Ladens.

+0

Der zweite Import wird nur dann gedruckt, wenn Das Modul wird mit 'reload()' über der dritten Zeile neu geladen. –

2

Python muss das gesamte Modul laden, um etwas davon zu importieren. Python importiert das gesamte Modul in seinen Modul-Cache, aber nur die Symbole, die Sie importieren, sind für Sie sichtbar. (Wenn Sie ein zweites Mal importieren, wird es nicht ausgeführt, da das Modul beim ersten Mal zwischengespeichert wird.)