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_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 導入

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章