from 和 import 导入的区别

本文探讨了Python中from和import导入的不同之处,详细解释了变量在不同情况下的共享机制,并通过实例演示了两种导入方式的实际应用及其对内存和命名空间的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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` 语句 在 Python 中,模块导入是一种常见的操作方式。为了保持代码的可读性维护性,推荐遵循一定的规范来使用 `from ... import` 语句。 #### 避免通配符导入 不建议使用通配符进行模块导入,例如 `from module_name import *`。这种做法会污染命名空间并可能导致意外覆盖变量名的情况发生[^1]。相反,应该明确指定要导入的具体对象: ```python # 不推荐的方式 from math import * # 推荐的方式 from math import sqrt, pi ``` 通过上述方法可以清晰表明哪些名称被引入当前作用域内,从而提高程序透明度调试便利性。 #### 导入特定函数或类 当只需要某个模块中的部分功能时,可以通过 `from ... import` 来单独加载这些组件: ```python from datetime import date, timedelta today = date.today() yesterday = today - timedelta(days=1) ``` 这里只从datetime库中选取了date与timedelta两个成员用于日期处理运算. #### IronPython 特殊情况下的行为说明 对于某些特殊环境如IronPython,在执行标准字符串方法的同时还可以调用CLR相关特性而不互相干扰[^2]: ```python import clr clr.AddReference('System.Windows.Forms') from System.Drawing import Point p = Point(0, 0) str_p = str(p).upper() # 使用的是常规Python string method upper(). ``` 此例子展示了即使是在集成.NET框架的情况下,原始Python的方法依旧能够正常运作. #### 结合第三方库的例子 如果项目依赖于外部包比如NumPy,则同样适用以上原则来进行精确控制所需资源: ```python evaluations = numpy.array([forward_solver(coordinates, sample)]) result_mean = evaluations.mean(axis=0) ``` 在此处我们仅取出了array以及后续可能使用的mean方法而不是整个numpy体系结构[^3]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值