2016-08-25 4 views
18

私は理解できないPythonの動作を見ています。このレイアウトを考えてみましょう:Pythonモジュールをインポートしました。なぜその中のメンバーの再割り当てが他の場所でのインポートにも影響しますか?

project 
| main.py 
| test1.py 
| test2.py 
| config.py 

main.py:

import config as conf 
import test1 
import test2 

print(conf.test_var) 
test1.test1() 
print(conf.test_var) 
test2.test2() 

test1.py:

import config as conf 

def test1(): 
    conf.test_var = 'test1' 

test2.py:

import config as conf 

def test2(): 
    print(conf.test_var) 

config.py:

test_var = 'initial_value' 

ので、python main.pyプロデュース:

initial_value 
test1 
test1 

私は最後の行で混乱しています。私はをtest2.pyに再度インポートしているので、もう一度initial_valueを印刷すると思っていました。前の手順で行った変更が上書きされると思いました。私は何かを誤解していますか?

+0

'reload(conf)'を間に入れてみて、その違いに注意してください。ロードされたモジュールはキャッシュされます。 'test?.py'に' conf'をロードすると、すでにロードされているモジュールへの参照が得られます。 – dhke

+0

私は、現在の答えが状態にないことは、モジュールのインポートがそれが保持するスクリプトを実行しないということです。正しく指摘されているように、Pythonはモジュールをキャッシュします。 – Petar

答えて

27

Pythonキャッシュインポートモジュール。 2番目のimport呼び出しはファイルをリロードしません。

+0

チェックしたい場合、 'sys.modules'にはすべてのキャッシュされたインポートへの参照が含まれています。 –

+1

reloadは、Python2では 'reload(conf)'、Python3では 'importlib.reload(conf)'を呼び出すことで実行できます。 –

4

test_vartest1.pyに編集し、test2.pyを使用してもう一度印刷しました。再度インポートすると、変数に新しい値を割り当てた場合と変わりません。値を最初の値に「リセット」しません。

1

いいえ、あなたはconfig.pyの定数値でtest1()で変更しています。 これはリセットされません。 test2()で印刷するので、変更された値が再び印刷されます。

4

test1を実行したときにtest_varの値を変更したため、test2を実行したときに既に変更されていました。

この変数は、インポートするファイルごとにリセットされません。それはすべてのための1つの値になります。

8

test2.py

import config as conf 

def test2(): 
    print(id(conf.test_var)) 
    print(conf.test_var) 

test1.pyこのような

import config as conf 

def test1(): 
    conf.test_var = 'test1' 
    print(id(conf.test_var)) 

変更コード。

のでmain.py

initial_value 
140007892404912 
test1 
140007892404912 
test1 

を実行して、あなたは両方のケースでは、同じ変数の値を変更していることがわかります。これらを参照してくださいidのは同じです。

関連する問題