2017-11-10 1 views
1

私たちが別のモジュールをインポートするモジュールをインポートすると、何が起こっているのか不思議でした。そこで私はmodule1とmodule2の2つのモジュールを作成します。別のモジュールをインポートするインポートモジュール。 Python

モジュール1:

import random 
print(random.randint(0,10)) 
print("module1 work") 

モジュール2:

import module1 
print("module2 work") 

私はそれが私にこの出力を与えるモジュール2実行すると:だから

1 
module1 work 
module2 work 

、私は私が実際にrandomをインポートしなかったことを決めました、私がmodule1を輸入したとき。しかし、シェルを入力すると、print(random.randint(0,10))NameError: name 'random' is not definedを投げます。したがってmodule1からrandomをインポートできませんでした。しかし、この場合、なぜmodule21と表示され、シェルと同じエラーが表示されませんでしたか?

+2

をインポートしません。グローバル名前空間の名前。 'module1.random.randint(0,10)'を試してください。 – chepner

答えて

3

各モジュールには独自のスコープ(または名前空間があります。 module2からrandomにアクセスする場合は、module2にインポートする必要があります。インタプリタは実行するモジュールのスコープを共有するので、そのモジュールのグローバル名前空間で宣言された変数だけにアクセスできます。通訳者がmodule2のみをインポートしたrandomにアクセスする場合は、module1.randomを指定する必要があります。

import module1from module1 import *に置き換えることもできます。それはrandomへの参照を含むすべてをコピーします。したがって、randomは世界中からアクセス可能です。

+0

module2でランダムをインポートしたくない場合は 'print(module1.random.randint(0,10))'を実行することができます – Sheshnath

0

これは、モジュールを含むファイルだけでなく、実際にランダムをシェルにインポートしていないためです。

import enum 
import sys 

彼らはTkinterのモジュールにインポートするが、彼らはそれが付属していませんTkinterにインポートするとき:

我々はで開き例のTkinterのために、一例として、既存のモジュールを使用することができます。

は、それが単に可能な限りである置くためにあなたの module1ランダム輸入しているが、実行されたモジュールは、必ずしも `module`のオブジェクトがバインドされているという意味ではありませんからといって module1をimporingも random

関連する問題