ホームページ >バックエンド開発 >Python チュートリアル >Pythonのfrom module import *の落とし穴
しかし、別の問題があります。あなたは、特定の変数を変更したと思っていますが、実際には、from モジュール import * の後の変数は更新されていません。これは、プログラムがまだ正常に実行される可能性があるため、非常に危険ですが、結果は次のようになります。はい、本番まで発見されなかったら大惨事になります。
例:
基本モジュールでいくつかの変数を定義しました:
# reference data type class Demo: def __init__(self, name): self.name = name demo = Demo('Demo') # primitive type foo = 1
次に、from module import を使用してモジュールで読み取ります。
from base import * def read(): print 'reference data id: ' + str(id(demo)) print 'reference data value : ' + demo.name print 'primitive data id: ' + str(id(foo)) print 'primitive data value: ' + str(foo)
別のモジュールに書きます:
import base def write(): print "\nOriginal:" print "Original reference data id: " + str(id(base.demo)) base.demo.name = "Updated Demo" # this will reflect that change #base.demo = base.Demo("Updated Demo") # this won't relfect the change print "Original data id: " + str(id(base.foo)) base.foo = 1000 print "Original data id after assignment: " + str(id(base.foo))
次に、最初に書き込み、次に読み取りを行って、書き込まれた内容が有効かどうかを確認します。
import read import write print "before write" read.read() write.write() print "\nafter write" read.read()
結論はノーです、理由は次のとおりです:
from module import を使用する場合、実際にはメモリを指す参照またはポインタをコピーし、var と module.var の両方が同じメモリを指します
module.var を変更すると、実際には別のメモリを指すようになります。このとき、var と module.var は異なるメモリを指します
。
したがって、module.var の値は変更されましたが、var は依然として元のメモリと元の値
を指します。
これはオブジェクトの場合は理解しやすいですが、オブジェクト内の値を直接変更することはできますが、別のオブジェクトを指す場合は無効です。 プリミティブ型の場合、既存のメモリをインプレース変更するのではなく、各割り当てが異なるメモリ アドレスを指すため、これは実際には同じです。これは簡単に検証できます:
In [1]: a = 10 In [2]: id(a) Out[2]: 20429204 In [3]: a = 100 In [4]: id(a) Out[4]: 20430108
したがって、手早く汚いスクリプトでない限り、from module import * を使用しないことをお勧めします。
例: https://github.com/baiyanhuang/blog/tree/master/arena/python/from_module_import