7

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

#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
>>>

我预计会出现错误,因为我只导入了fibfib2. 但是我不明白为什么当我只导入fib和时打印声明fib2

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

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

预期的结果应该是什么?

4

2 回答 2

10

这是预期的行为。当您使用 导入时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. 模块在加载时知道自己的名称。

于 2012-06-12T08:46:11.590 回答
2

Python 必须加载整个模块才能从中导入任何内容。Python 将整个模块导入其模块缓存,但只有您导入的符号对您可见。(如果你第二次导入,它不会运行;这是因为模块在第一次导入时被缓存了。)

于 2012-06-12T08:45:29.540 回答