python import xxx 与 from xxx import xx 模块引入的区别

本文通过一个简单的Python脚本,详细对比了使用import和from...import...两种方式导入模块时,变量作用域的不同表现。这对于理解Python模块导入机制,避免命名冲突,具有一定的指导意义。

 

有如下脚本script1.py:

A='aaaa'
B='bbbb'
C='cccc'
print A,B,C

 

1.命令行交互模式下使用import 导入方式1:

>>>import script1

再分别输入命令打印:

>>>print script1.A, script1.B, script1.C

>>>print A,B,C

结果如下:

可以看到

 print script1.A, script1.B, script1.C正常取到A,B,C的值

但是print A,B,C却报错了,A未声明

2.使用from ... import ...的方式导入:

>>>from script1 import A,B,C

分别输入命令打印:

>>>print script1.A, script1.B, script1.C

>>>print A,B,C

其运行结果如下:

 

可以看到,print A,B,C正确取到值,但是script1.A 报错,script1未声明

综上可以看出 两种方式引入的区别,这两种方式导入的变量存储是这样的:

 

 

转载于:https://www.cnblogs.com/wolfshining/p/7410815.html

<think>好的,我现在需要回答用户关于Python中直接importfrom...import区别的问题。首先,我得回忆这两种导入方式的基本用法和差异。用户可能想知道它们在语法、作用域、内存使用等方面的不同。 首先,直接import,比如import module,这样导入整个模块,使用时需要module.function()。而from module import function则是导入特定函数,可以直接用function()。这可能导致命名冲突,比如如果当前作用域已经有同名的function,就会被覆盖。 接下来要考虑作用域的问题。直接import需要模块名前缀,避免命名冲突,但代码可能冗长。而from...import可能让代码更简洁,但需要确保导入的名称不会其他名称冲突。 然后是内存使用方面。直接导入整个模块是否会导致内存占用更高?其实Python模块是单例的,无论用哪种方式导入,模块只会加载一次。不过from...import会将该函数添加到当前命名空间,可能增加当前命名空间的条目数量,但实际内存差异应该不大。 还要考虑循环导入的问题。两种方式在循环导入时是否有不同的表现?可能需要进一步查证,但通常循环导入问题更多导入时机有关,而不是导入方式本身。 另外,用户提到的引用[1]和[2]需要合理引用。引用[1]提到模块导入路径的知识,可能模块搜索路径有关,但可能和问题关联不大。引用[2]关于Python减少代码量,可能和导入方式的选择对代码简洁性的影响有关,可以适当关联。 用户可能还想知道性能差异。一般来说,两种导入方式在性能上差别不大,因为模块只加载一次。不过使用from...import的函数调用可能稍快,因为少了一次属性查找,但差异通常可以忽略不计。 还要注意,使用from...import * 是不推荐的,因为它会导入所有名称,容易引起命名冲突,且代码可读性差。但用户的问题中没有提到这种情况,可能需要说明。 总结区别点:语法、作用域影响、命名冲突风险、代码简洁性、性能(微小差异)、可维护性。需要以清晰的结构呈现这些点,并引用相关资料支持。 可能还需要给出示例代码,比如: 直接importimport math print(math.sqrt(4)) from...importfrom math import sqrt print(sqrt(4)) 这样对比更直观。 最后,确保回答符合用户的要求:结构清晰,分步骤说明,引用正确,并生成相关问题。现在需要检查是否有遗漏点,比如模块重命名(import module as md),但用户的问题可能不涉及这点,不过可以简要提及。 现在组织内容,确保每个部分清晰,并自然引用给定的参考文献。</think>### Python中直接importfrom...import区别Python中,模块导入的两种主要方式(`import module` 和 `from module import name`)有以下核心区别: --- #### 1. **语法作用域** - **直接导入模块** 使用`import module`时,模块的所有内容需通过模块名前缀访问: ```python import math print(math.sqrt(4)) # 输出: 2.0 ``` 优点:避免命名冲突,明确函数来源。 缺点:代码较长,频繁使用时需重复输入模块名[^1]。 - **从模块导入特定对象** 使用`from module import name`时,可直接使用对象名: ```python from math import sqrt print(sqrt(4)) # 输出: 2.0 ``` 优点:代码简洁,减少冗余。 缺点:若当前命名空间有同名对象,会导致覆盖(例如自定义的`sqrt`函数会被替换)。 --- #### 2. **内存性能** - **内存占用** 两种方式均会加载整个模块到内存,但Python会缓存已导入的模块,因此多次导入不会增加内存消耗[^2]。 - **性能差异** `from...import`的调用可能略快,因为省去了模块属性的查找步骤,但差异通常可忽略不计。 --- #### 3. **代码可维护性** - **直接导入** 明确标识函数来源,适合大型项目或多人协作,提升代码可读性。 例如:`numpy.array`和`array.array`可通过模块名清晰区分。 - **选择性导入** 适用于频繁使用少数函数的情况,但需谨慎处理命名冲突。 --- #### 4. **其他用法** - **别名导入** 两种方式均可使用别名简化代码: ```python import numpy as np from math import factorial as fac ``` - **通配符导入(不推荐)** `from module import *`会导入所有公共对象,易引发命名冲突,应避免使用。 --- #### 示例对比 | 直接导入 | 选择性导入 | |----------------------------|------------------------------| | `import os` | `from os import path` | | `os.path.join(...)` | `path.join(...)` | | 明确来源,避免冲突 | 代码简洁,但需注意命名空间污染 | --- ### 总结 - **优先使用直接导入**:当需要明确函数来源或避免命名冲突时(例如标准库第三方库混合使用)。 - **选择性导入适用场景**:代码简洁性要求高,且能确保命名空间安全时。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值