fromとimportインポートの違い
5400 ワード
fromとimportインポートの違い importは、必ず変数を実現できるグローバル共有 を導入する. fromインポートは必ずしも変数のグローバル共有を実現できるとは限らず、可変タイプが定義されている場合にのみグローバル共有が可能であり、不変タイプはグローバル共有が不可能であり、グローバル変数とローカル変数 と同様である.実際の開発ではfrom xx import yyという正確な導入方式 を選択すべきである. from xx import*の導入は推奨されません . 欠点1:インポートされたモジュール変数が多すぎるとメモリが大量に消費され、プログラムの実行性能が 低下する.
欠点2:変数が多すぎると、自分で定義した変数とインポートした変数の名前が重複しやすく、バグが発生します.
importインポートの使用シーン:システムモジュールのインポート、またはグローバル共有が必要なモジュール のインポート
モジュールをカスタマイズして両者の違いを検証
fromインポート共通モジュールcommon を定義する
-受信データおよび処理データモジュールrecv_の定義msg, handle_msg定義mainモジュール
-印刷結果
このときcommonモジュールのRECV_DATA_LIST,HANDLE_FLAGをモジュールrecv_にインポートmsgとhandle_msgで差があるRECV_DATA_LISTはリストが可変タイプなので、グローバルに共有されるので、印刷結果は[0,1,2,3,4]HANDLE_FLAGがboolタイプであることは可変タイプであるため、グローバル共有は行われず、キーワードglobalでグローバル共有が可能である
importインポート
インポートした変数はすべてグローバル共有です
モジュールをカスタマイズして両者の違いを検証
fromインポート
RECV_DATA_LIST = list()
HANDLE_FLAG = False
-受信データおよび処理データモジュールrecv_の定義msg, handle_msg
from common import RECV_DATA_LIST
from common import HANDLE_FLAG
def recv_msg():
""" , common """
print("--->recv_msg")
for i in range(5):
RECV_DATA_LIST.append(i)
def test_recv_data():
""" """
print("--->test_recv_data")
print(RECV_DATA_LIST)
def recv_msg_next():
""" , """
print("--->recv_msg_next")
if HANDLE_FLAG:
print("------ , ( ...)----")
else:
print("------ , ....------")
from common import RECV_DATA_LIST
from common import HANDLE_FLAG
def handle_data():
""" recv_msg """
print("--->handle_data")
for i in RECV_DATA_LIST:
print(i)
global HANDLE_FLAG
HANDLE_FLAG = True
def test_handle_data():
""" , True"""
print("--->test_handle_data")
if HANDLE_FLAG: # False
# if common.HANDLE_FLAG: # True
print("===== ====")
else:
print("===== ====")
from recv_msg import *
from handle_msg import *
def main():
""" from """
recv_msg()
test_recv_data()
recv_msg_next()
handle_data()
test_handle_data()
recv_msg_next()
if __name__ == "__main__":
main()
-印刷結果
--->recv_msg --->test_recv_data [0, 1, 2, 3, 4]
--->recv_msg_next ------ , ....------ --->handle_data 0
1
2
3
4
--->test_handle_data ===== ==== --->recv_msg_next ------ , ....------
このときcommonモジュールのRECV_DATA_LIST,HANDLE_FLAGをモジュールrecv_にインポートmsgとhandle_msgで差があるRECV_DATA_LISTはリストが可変タイプなので、グローバルに共有されるので、印刷結果は[0,1,2,3,4]HANDLE_FLAGがboolタイプであることは可変タイプであるため、グローバル共有は行われず、キーワードglobalでグローバル共有が可能である
importインポート
インポートした変数はすべてグローバル共有です