结果为:

python b.py

in a

2

2

4

如果将代码修改如下:

#a.py

test = 2

print 'in a'

#b.py

import a

print a.test

a.test = 3

import c

print c.a.test

#c.py

import a

print a.test

a.test = 4

结果为:

python b.py

in a

2

3

4

如果,我们把a.py中的test = 2修改为 test = [2],后面对test的修改改为对test[0]的修改,则会发现,import和from import的结果完全一致。

通过以上的分析。基本可以得到这样的结论:

1 重复import或from import多次都只会作用一次

2 import和from import的作用机制完全不同

3 import的机制是将目标模块中的对象完整的引入当前模块,但并不引入新的变量名

4 from import的机制则是通过引入新的变量名的形式,将目标模块的对象的引用拷贝到新的变量名下的方式引入当前模块

这样描述可能有点抽象,根据上面的例子来说就是:

1 当使用import时,只存在一个名为a.test变量,且只有这一个,无论是在b模块,还是c模块中

2 当使用from import时,在b模块中,存在一个新的变量b.test,开始时,b.test = a.test(它们共同指向同一个对象),当发生赋值时,b.test指向了一个新的对象,但a.test仍指向原来的对象。

具体来说就是:

(1) 初始时,在a中存在a.test变量,它指向一个整数对象‘2’

(2) 在执行b.py时,from a import * 的执行,相当于引入了一个新的变量名b.test,b.test = a.test,这时,b.test和a.test都指向整数对象‘2’

(3) 之后的赋值操作(test = 3),使得b.test = 3,使得b.test指向了整数对象'3',而a.test仍指向整数对象'2'

(4) 继续执行from c import * 时,进入c.py,在c模块中,执行from a import *,将引入新的变量名c.test,c.test = a.test,它们都指向整数对象'2',之后的赋值操作(test = 4),使得c.test = 4,现在,c.test指向了整数对象'4',而a.test仍指向整数对象'2'

(5) 回到b.py,由于b.test已存在,因此,不引人新的变量,而是直接执行b.test = c.test,这时,b.test指向整数对象'4'

最终的结果,a.test指向'2',b.test指向'4',c.test指向'4'

3 当test变为list时,b.test[0]的修改,并没有引起b.test本身的变化,换言之,b.test和a.test仍指向同一个对象,只不过这个对象内部被修改了

总结:

1 from import很危险,如果不了解其作用机制,慎用

2 即便知道了机制,一样要慎用

python from import 和 import 区别_python import和from import的区别相关推荐

  1. python中的return和print的区别_python中return和print的区别(详细)

    Huskiesir python最近正在研究.今天,我面临一个问题,那就是,返回和印刷的区别.双方都能输出结果.的区别是什么?闲话少说,看下面的例子.# Code1: def break_words( ...

  2. python 引入同一路径的类_Python入门 模块导入 import ...\from... import...

    代码越来越多的时候,我们将代码写到一个.py 文件里,随着代码的增加,代码的维护越来越困难.如果将代码按照不同的功能拆分放到不同的.py文件中,每个.py文件就是一个模块. 不同模块中的变量名可以相同 ...

  3. python中的列表和元组_python中列表和元组的区别

    如果有了解过python中的列表和元组,你可能会知道相对于列表,元组是不可变的,也就是说元组中的数据不能随意更改.除了列表是用中括号表示而元组是用小括号表示之外,这两种数据类型好像并没有什么不同,都是 ...

  4. python中copy和deepcopy的区别_python里shadowcopy和deepcopy的区别

    python中,经常会需要拷贝特定对象,在此可能就会遇到各种bug,原因就是明白这三种操作的区别,赋值,浅拷贝,深拷贝. 赋值(=),浅拷贝(copy)和深拷贝(deepcopy)比较容易区别开的是赋 ...

  5. python中datetime是什么意思_Python中time和datetime的区别与联系

    Python 中提供了对时间日期的多种多样的处理方式,主要是在 time 和 datetime 这两个模块里.今天稍微梳理一下这两个模块在使用上的一些区别和联系. Python表示时间的两种方式: 1 ...

  6. python中浅拷贝和深拷贝的区别_Python中浅拷贝和深拷贝的区别

    Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  7. python赋值浅拷贝和深拷贝的区别_python赋值、浅拷贝、深拷贝区别

    在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<Py ...

  8. python中dumps是什么意思_python中的dumps和loads区别

    一.概念理解 json是一种轻量级的数据交换格式,对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如: {"name":"cc ...

  9. python中num是什么意思_python – num_epochs和步骤有什么区别?

    在tensorflow入门代码中: import tensorflow as tf import numpy as np features = [tf.contrib.layers.real_valu ...

  10. python中utf-8是什么意思_python中Unicode和UTF-8的区别

    1,UTF-8 在python的开始处,#coding:utf-8或者#coding=utf-8的作用一样,声明Python代码的文本格式是UTF-8,按照这种格式来读取程序. 如下编写一个脚本: 如 ...

最新文章

  1. RISC-V有何特别之处?
  2. jenkins+jmeter+ant+jmeter在Jenkins上报告
  3. MVC应用程序实现上传文件(续)
  4. Matlab的内部常数
  5. Ecplise中的Maven项目提示找不到jar包
  6. C++ zip压缩库使用
  7. 怎么把电脑计算机桌面调出来,手把手教你电脑怎么设置屏保
  8. 计算机学的是苹果系统,苹果电脑装windows7教程 苹果电脑装windows7方法
  9. Python爬虫——爬取网站的图片
  10. 解决go合约fabric shim peer依赖问题
  11. vue核心之虚拟DOM(vdom)与真实DOM页面渲染过程
  12. 匈牙利为庆贺第17届奥运会而发行的纪念邮票
  13. 字节跳动取消大小周;淘宝、支付宝等阿里系App取消开屏广告;Python 3.10 beta 4发布
  14. 剑指 Offer 58 - II. 左旋转字符串
  15. 下载xampp之后还用下载PHP吗,PHP 下载并安装XAMPP
  16. 星际争霸1终于可以在win10上运行了
  17. 水位传感器c语言程序,基于STC89C51单片机的水位传感器控制系统设计.doc
  18. k8s之ingress
  19. openwrt系统下修改网关_OpenWRT路由配置技巧
  20. Fastjson处理复杂层级关系的json对象

热门文章

  1. Linux 磁盘管理 一(Raid、LVM、Quota)
  2. DedeCMS专题版块多种方法随意调用
  3. 48. 减少 DNS 查找(9)
  4. 119. PHP 性能问题(2)
  5. 20. Element innerHTML 属性
  6. php中is_scalar判断是否是标量
  7. Go Node.js 生成的exe公布成windows服务
  8. python 列表转字典的一些方法
  9. RxJava Map操作详解
  10. weblogic启动失败:Could not obtain the localhost address 解决办法