Python:导入模块

fut*_*110 6 python

让我说我有一个python模型fibo.py定义如下:

#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
Run Code Online (Sandbox Code Playgroud)

在我的翻译会话中,我执行以下操作:

>> 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'
>>> 
Run Code Online (Sandbox Code Playgroud)

到目前为止一直很好......解释者:

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)

我预计错误,因为我只导入了fib和fib2.但是我不明白为什么只在我输入fib和fib2时才打印声明.

其次,如果我将模块更改为:

#Fibonacci numbers module
print "This is a statement"
print __name__
Run Code Online (Sandbox Code Playgroud)

预期结果应该是什么?

Fre*_*Foo 9

这是预期的行为.导入时from X import Y,仍会加载并执行模块,如语言参考中所述.事实上,当你这样做

from fibo import fib
print("foo")
import fibo
Run Code Online (Sandbox Code Playgroud)

将打印This is a statement,然后foo.第二个import不打印任何内容,因为模块已经缓存.

您的第二个模块将打印,This is a statement然后打印fibo.模块在加载时知道自己的名字.