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

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

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


分享到:


相關文章: