Python:导入模块

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,所以我预料到会出现错误。但我不明白为什么当我只导入fibfib2时,该语句会被打印出来。

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

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

预期结果应该是什么?

你可以使用带有 yield b 的单个函数:1. for f in fib(n): print f 2. result = list(fib(n)) - jfs
2个回答

10

这是预期的行为。当您使用from X import Y导入时,该模块仍会被加载和执行,正如语言参考手册所述。事实上,当您执行以下操作时

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

会输出This is a statement,然后是foo。第二个import不会输出任何内容,因为该模块已被缓存。

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


如果在第三行之上使用 reload() 重新加载模块,则第二个引入语句将被打印出来。 - Ashwini Chaudhary

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接