python import, from xx import xx的一些理解, 以及解答一些from xx import xx可以, import xx无效的情况

  • 先挂标准解释
    • 原文
    • 翻译(google)
  • 主要讨论import 和 from import
    • 通俗理解
    • 不讲概念了, 直接案例
      • 先使用import
      • 接着from import
  • 在flask中不使用blueprint, 又想分文件, 所以遇到改问题
  • 最后理解

先挂标准解释

引用地址–>http://effbot.org/zone/import-confusion.htm

原文

import X imports the module X, and creates a reference to that module in the current namespace. Or in other words, after you’ve run this statement, you can use X.name to refer to things defined in module X.

from X import * imports the module X, and creates references in the current namespace to all public objects defined by that module (that is, everything that doesn’t have a name starting with “_”). Or in other words, after you’ve run this statement, you can simply use a plain name to refer to things defined in module X. But X itself is not defined, so X.name doesn’t work. And if name was already defined, it is replaced by the new version. And if name in X is changed to point to some other object, your module won’t notice.

from X import a, b, c imports the module X, and creates references in the current namespace to the given objects. Or in other words, you can now use a and b and c in your program.

Finally, X = import(‘X’) works like import X, with the difference that you 1) pass the module name as a string, and 2) explicitly assign it to a variable in your current namespace.

翻译(google)

import X导入模块X,并在当前名称空间中创建对该模块的引用。换句话说,运行此语句后,可以使用X.name引用模块X中定义的内容。

from X import *导入模块X,并在当前名称空间中创建对该模块定义的所有公共对象的引用(即,所有不具有以“ _”开头的名称的对象)。换句话说,运行该语句后,您可以简单地使用一个简单的名称来引用模块X中定义的内容。但是X本身未定义,因此 X.name不起作用。如果已经定义了名称,则将其替换为新版本。而且,如果将X中的名称更改为指向其他对象,则您的模块将不会注意到。

from X import a, b, c导入模块X,并在当前名称空间中创建对给定对象的引用。换句话说,您现在可以在程序中使用a,b和c。

最后,X = __import __(‘X’)的作用类似于import X,不同之处在于您1)将模块名称作为字符串传递,以及2)将其显式分配给当前名称空间中的变量。

主要讨论import 和 from import

通俗理解

例:import time
直接import 导入, 开辟内存空间time, 将time模块下的代码读入内存, 例: sleep, 通过time.sleep()使用, 简单来说就是当前运行就只有一个time变量例: from time import sleep
在当前工作空间创建sleep变量, 直接sleep()使用, 所有容易被覆盖

不讲概念了, 直接案例

先使用import

-----新建a.py------------------------------------------------------------------------------------------

example = {'a': 0}
# 主要关注import b
import bif __name__ == "__main__":print(example)print(b.example)

-----新建b.py------------------------------------------------------------------------------------------

from a import exampleexample['b'] = 0

运行a.py后打印

{'a': 0}
{'a': 0, 'b': 0}

解释:
从上往下依次理解
新建example = {‘a’: 0}
import b: 运行b.py到from a import example:
又重新执行一个a.py到example(!!!注意这里的example是另外一个了),
接着example[‘b’] = 0, 执行完b.py回到a.py打印第一个example, 这个很好理解,
接着一个b.example是因为重新执行一个a.py中获取到example = {‘a’: 0}在执行example[‘b’] = 0
所以最后打印结果

接着from import

-----新建a.py------------------------------------------------------------------------------------------

example = {'a': 0}
# 主要关注from b import *
from b improt *if __name__ == "__main__":print(example)

-----新建b.py------------------------------------------------------------------------------------------

from a import exampleexample['b'] = 0

运行a.py后打印

{'a': 0, 'b': 0}

解释:
从上往下依次理解
新建example = {‘a’: 0}
from b improt *: 运行b.py,
from a import example
example[‘b’] = 0
将b中变量都在a中创建一个, 这时候b中第二个example就会覆盖掉a中example
所以最后打印结果

{'a': 0, 'b': 0}

在flask中不使用blueprint, 又想分文件, 所以遇到改问题

最后理解

原文:https://www.jianshu.com/p/a2cbf2bddf83
在Python中,导入并不是把一个文件文本插入另一个文件中。导入其实是运行时的运算,程序第一次导入指定文件时,会执行三个步骤。
1、搜索找到模块文件。
2、编译成字节码(需要时)。
3、执行模块的代码来创建其所定义的对象,定义 import 语句所在文件的作用域的局部命名空间中的一个或多个变量名。这三个步骤只在模块第一次导入时才会执行。在这之后,导入相同模块时,会跳过这三个步骤,而只是提取内存中已加载的模块对象。这是有意而为之的,因为该操作开销较大。如果你在模块已加载后还需要再次导入(例如,为了支持终端用户的定制),你就得通过调用 reload() 强制导入模块。从技术上讲,Python 把载入的模块存储到一个名为 sys.modules 的表中,并在导入操作的开始检查该表。如果模块不存在,将会自动执行上面的三个步骤。

看完后理解了为何在循环导入有疑问时, 在运行文件和模块文件都加入print语句运行文件会执行两次, 而模块文件却不会, 是因为运行是没有当做导入的, 所以不会存在导入模块表中, 然后当模块文件重新导入运行文件时, 这时候运行文件就被当做模块文件导入了, 所以运行文件经常被加载两次, 而模块文件之后加载一次, 之后的导入都是去模块文件加载内存中去取变量

python import和from xx import xx的理解相关推荐

  1. 协议 + socket import 和 form xx import *的区别 028

    协议 + socket import 和 form xx import *的区别 028 一 . 网络通信协议(了解) 1 . osi 七层协议 (最好记住 面试会问) 应表会传网数物(应用层 表示层 ...

  2. python基础--自定义模块、import、from......import......

    自定义模块.import.from......import...... 1)模块的定义和分类 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例 ...

  3. [ 转]Python模块(二)import和from...import的区别

    Python模块(二)import和from...import的区别 听语音 原创 | 浏览:2975 | 更新:2018-04-02 13:02 | 标签:PYTHON 1 2 3 4 5 6 7 ...

  4. Python 学习之二: module, import 与 import as

    2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/fanshengchong/article/details/7039692 Pyth ...

  5. Ubuntu下python升级pip(ImportError: cannot import name 'main')

    简述 在网上根据 https://blog.csdn.net/Mr_Cat123/article/details/80427511 升级pip遇到了这个问题. Traceback (most rece ...

  6. Bug总结:python语言中出现的import error错误的解决思路

    Bug总结:python语言中出现的import error错误的解决思路 目录 解决问题 解决方法 解决问题 import error错误 解决方法 T1.查看是否存在该包,要么是python集成好 ...

  7. python type help copyright_Python关于import的实验(8)__init__.py文件内部代码的执行以及内部的导入和内部的变量...

    Python官方文档参考链接: 常规包 Python 定义了两种类型的包,常规包 和 命名空间包. 常规包是传统的包类型,它们在 Python 3.2 及之前就已存在. 常规包通常以一个包含 __in ...

  8. python from import 路径_python from...import *

    python from...import * 最近在写代码的时候,导入包总是出现一些问题,应该是form...import还没有很好的掌握. 查了一些资料,总结如下: import模块:导入一个模块: ...

  9. python cannot import name main_virtualenv: cannot import name 'main'

    问题 I'm having a little trouble with virtualenv on Mac OS X Yosemite. After I couldn't run virtualenv ...

最新文章

  1. dos环境下mysql的访问_MYSQL dos环境下使用
  2. java css_JavaWeb中基本的CSS的使用
  3. 2019厦门科技中学计算机特长,中考快讯 | 2019厦门市高中特长生招生学校名单出炉!...
  4. kickStart脚本
  5. WinCE EBOOT中的BootPart分析
  6. 有间距的表格布局 table布局
  7. 2021年你想转行吗?写给迷茫的你!
  8. [日常工作]非Windows Server 系统远程经常断以及提高性能的方法
  9. 汇编中DOSBox的使用
  10. 信息系统项目管理师通过率是多少?
  11. 基于Eclipse+Java+Swing+Mysql实现旅游管理信息系统
  12. html调取android手机录音并保存,html5网页录音插件Recorder
  13. arcgis实现cad图斑批量导入后,图斑颜色设置cad图层颜色保持一致
  14. 二、Contiki移植
  15. 在PPT中批量导入图片
  16. 最新论文笔记(+11):Privacy-Preserving Searchable Encryption Framework for Permissioned Blockchain Networks
  17. [BZOJ2069][POI2004]ZAW
  18. 苹果CMSV10最新初恋视界手机版模板
  19. uni-app 最简单的显示隐藏
  20. 王道书 P360 T03(计数排序)

热门文章

  1. 文件操作,函数练习及答案
  2. 集列的上限集和下限集
  3. AXI Quad SPI读写Flash做远程升级
  4. Microsoft Graph PowerShell v2 发布公开预览版 - 一半的大小,加速的自动化体验
  5. 小米6Android无响应,小米手机mui12 android9 App跳转微信小程序无任何响应。求解决...
  6. Spring中使用Map、Set、List、数组、属性集合的注入方法配置文件
  7. 对折纸张(蓝桥杯真题)
  8. Simulink导出FMU方法
  9. 关系的性质判断(自反,对称,传递)
  10. 电脑系统还原节点怎么创建