「python」from 導入和 import 導入的區別

from 和 import 導入的區別

  • import 導入一定能實現變量的全局共享
  • from 導入不一定能實現變量的全局共享,只有定義的是可變類型才能全局共享,不變類型無法全局共享,類似於全局變量和局部變量
  • 在實際開發中,應該選擇使用 from xx import yy 這種精準的導入方式
  • 不推薦使用 from xx import * 這種導入方式
  • 缺點一 :如果導入的模塊變量太多則會佔用大量內存,程序運行性能會降低
  • 缺點二 :變量太多容易導致自己定義的變量和導入的變量重名,會出現bug。
  • import導入的使用場景 :導入系統模塊,或者導入需要進行全局共享的模塊

通過自定義模塊來驗證兩者的區別

from 導入

  • 定義公共模塊 common
RECV_DATA_LIST = list()HANDLE_FLAG = False
  • 定義接收數據和處理數據模塊 recv_msg, handle_msg
from common import RECV_DATA_LISTfrom common import HANDLE_FLAGdef 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 = Truedef 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_data01234--->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 導入

導入的變量全部是全局共享

「python」from 導入和 import 導入的區別


分享到:


相關文章: