fromとimportインポートの違い

5400 ワード

fromとimportインポートの違い
  • importは、必ず変数を実現できるグローバル共有
  • を導入する.
  • fromインポートは必ずしも変数のグローバル共有を実現できるとは限らず、可変タイプが定義されている場合にのみグローバル共有が可能であり、不変タイプはグローバル共有が不可能であり、グローバル変数とローカル変数
  • と同様である.
  • 実際の開発ではfrom xx import yyという正確な導入方式
  • を選択すべきである.
  • from xx import*の導入は推奨されません
  • .
  • 欠点1:インポートされたモジュール変数が多すぎるとメモリが大量に消費され、プログラムの実行性能が
  • 低下する.
  • 欠点2:変数が多すぎると、自分で定義した変数とインポートした変数の名前が重複しやすく、バグが発生します.

  • importインポートの使用シーン:システムモジュールのインポート、またはグローバル共有が必要なモジュール
  • のインポート
    モジュールをカスタマイズして両者の違いを検証
    fromインポート
  • 共通モジュールcommon
  • を定義する
    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("=====     ====")
  • 定義mainモジュール
  • 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インポート
    インポートした変数はすべてグローバル共有です