Python——import和from import方法总结

本文探讨了Python中的模块和包的概念,比较了import和from的使用方法,重点分析了它们在内存分配上的差异,以及在多程序共享和修改模块时的不同效果。

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

基本概念:

模块:所谓模块就是一个.py文件,用来存放变量,方法的文件,便于在其他python文件中导入(通过import或from)。

包(package): 包是更大的组织单位,用来组织区别管理多个模块文件。

import 用来导入模块

from 用于从模块中导入工具(可以是某个函数,全局变量,类),也可用as 重命名导入的方法名

import 和 from 常用使用方法:

from A import a1 :从A模块导入a1工具(可以是某个函数,全局变量,类)

import A:导入整个A模块的全部内容(包括全部的函数,全局变量,类)

内存分析:

from...import...会在内存中创建并加载该模块工具的副本,当有另外一个程序导入时,会在内存中浅复制另一个副本(变量而非函数)进行加载,不会共用一个副本。所以程序进行的修改不会影响到被导入的原模块,且不同程序之间不会互相影响。

import...方法导入模块会在内存中直接加载该模块的全部属性。当出现多个程序导入该模块时,会共用一个模块,程序之间会互相影响,包括原模块。

使用场合:

当多个程序需要同时导入一个模块并且都是访问时,使用import 可以节省内存空间

当多个程序需要同时导入一个模块当其中一个需要修改模块,那么修改的模块的程序应该使用from来导入模块

使用特点:

import a:使用都要加上a这个包名,比如a.data,表示用的都是a包里面的data字段

form a import *,可以直接使用包里面的字段,这些字段已经复制到了这个文件的新包里面

#a.py
data=[1,2,3]
 
def run():
    print(data)
#b.py
from a import run,data
 
data[0]=5 #类似赋值,b里面的data和a里面的data指向同一个对象,这么做对两者都有影响
print(data) #输出[5,2,3] 
run()#输出[5,2,3]
 
data=100 #由于直接改变了data的指向,所以不会影响源模块a
print(data) #输出100
run()#输出[5,2,3]
#c.py
import a
#由于是直接import a 所以都是从源模块a里面拿出来的,所以这里的改变都会影响源模块a
#可以理解为有着作用域 a.的限制
a.data[0]=5 
print(a.data) #输出[5,2,3]
a.run() #输出[5,2,3]
 
a.data=100 #因为这里影响的是a里面的data
print(a.data) #输出100
a.run() #输出100

### Python 中 `import` `from xxx import` 的区别 在 Python 编程中,存在两种主要的方式用于导入模块或其内部成员:一种是通过 `import` 关键字直接导入整个模块;另一种则是利用 `from ... import ...` 结构仅加载特定的对象(如类、函数或者全局变量)。这两种方法虽然都能实现代码重用的目的,但在实际应用中有显著差异。 #### 导入方式对比 当采用 `import module_name` 形式的语句时,这会让解释器执行指定名称空间中的所有顶层可执行代码,并创建一个新的命名实体指向这个新建立的名字空间。之后,在调用其中的方法或属性前需加上模块名作为前缀[^1]: ```python import math result = math.sqrt(16) ``` 而使用 `from module_name import item` 则允许开发者更简洁地引用所需组件,因为这样可以省去每次都要重复输入完整的路径这一过程。不过需要注意的是,这种方式可能会引起名字冲突的风险,尤其是在不同源文件里有相同标识符的情况下[^2]: ```python from datetime import date today = date.today() ``` #### 修改导入对象的影响 值得注意的是,对于某些特殊情况而言——比如尝试改变已导入项的状态或值的时候——不同的导入策略会产生不一样的效果。例如在一个名为 `aaa.py` 的外部脚本中定义了一个整型变量 `a=1` 及相应的更新此数值的辅助功能 `changeA()` 后,如果分别采取上述两种途径来进行操作的话,则最终的结果会有所不同。 假设有一个简单的例子展示这一点: ```python # aaa.py 文件内容如下: a = 1 def change_a(): global a a = 2 # main.py 使用 import 方式 import aaa print(aaa.a) # 输出: 1 aaa.change_a() print(aaa.a) # 输出: 2 # main.py 使用 from...import 方法 from aaa import a, change_a print(a) # 输出: 1 change_a() print(a) # 输出仍然是 1,而不是预期的2 ``` 这是因为后者实际上是在本地作用域内复制了一份原始数据副本而非真正意义上的共享同一份实例化后的资源。 #### 绝对导入的重要性 另外值得一提的地方在于绝对导入的概念上。默认情况下,Python 解析器会在当前工作目录以及内置库列表里面寻找匹配的目标。然而有时候为了确保能够正确无误地获取到期望版本的标准库或者其他第三方依赖包,就需要显式声明启用绝对模式了。可以通过加入特殊指令来达到目的,即 `from __future__ import absolute_import`[^4]。 这样做不仅有助于避免潜在歧义问题的发生,同时也提高了程序逻辑上的清晰度维护便利性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值