ホームページ >バックエンド開発 >Python チュートリアル >Pythonのfrom module import *の落とし穴

Pythonのfrom module import *の落とし穴

WBOY
WBOYオリジナル
2016-06-16 08:43:101209ブラウズ

しかし、別の問題があります。あなたは、特定の変数を変更したと思っていますが、実際には、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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。