假设我有一个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
在我的口译员会议中,我会做以下事情:
>> 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'
>>>
到目前为止一直很好......解释者:
>>> 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
>>>
我预计错误,因为我只导入了fib和fib2。但是,当我只输入fib和fib2时,我不明白为什么要打印该声明。
其次,如果我将模块更改为:
#Fibonacci numbers module
print "This is a statement"
print __name__
预期结果应该是什么?
答案 0 :(得分:9)
这是预期的行为。使用from X import Y
导入时,模块仍会加载并执行,如Language Reference中所述。事实上,当你做的时候
from fibo import fib
print("foo")
import fibo
将打印This is a statement
,然后是foo
。第二个import
不会打印任何内容,因为模块已经被缓存。
您的第二个模块将打印This is a statement
,然后是fibo
。模块在加载时知道自己的名字。
答案 1 :(得分:2)
Python必须加载整个模块才能从中导入任何内容。 Python将整个模块导入其模块缓存中,但只有您导入的符号才可见。 (如果再次导入,它将不会运行;这是因为模块在第一次导入时被缓存。)