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

と のみをインポートfibしたため、エラーが発生することが予想されましたfib2fibしかし、インポートしただけでステートメントが出力された理由がわかりませんfib2.

次に、モジュールを次のように変更した場合:

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

期待される結果は何ですか?

4

2 に答える 2

10

これは予期される動作です。でインポートすると、言語リファレンスfrom X import Yに記載されているように、モジュールは引き続きロードされて実行されます。実際、あなたがするとき

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

が出力されThis is a statement、続いてfoo. モジュールが既にキャッシュされているため、 2番目importは何も出力しません。

2 番目のモジュールが出力さThis is a statementれ、その後にfibo. モジュールはロード時に自身の名前を認識しています。

于 2012-06-12T08:46:11.590 に答える
2

Python はモジュールから何かをインポートするためにモジュール全体をロードする必要があります。Python はモジュール全体をモジュール キャッシュにインポートしますが、インポートしたシンボルのみが表示されます。(2 回目にインポートすると実行されません。これは、モジュールが最初にインポートされたときにキャッシュされるためです。)

于 2012-06-12T08:45:29.540 に答える