先回顾一下理解程度

什么是不可变类型和可变类型?

  可变类型是,修改变量后 引用的内存地址不变,引用的内存中的内容发生变化(是针对变量名的引用来理解)。

# 在a.py中定义了一个test属性
test = [1, 2]
print(test ,id(test))
test.append('jack')
print(test, id(test)) 结果
C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/a.py
[1, 2] 44687112
[1, 2, 'jack'] 44687112 Process finished with exit code 0

可变类型

  不可变类型,修改变量后,内存地址发生变化,引用的内容也发生变化(针对变量名的引用理解),(如int类型再内存中的存储id是固定的,不同的数字存储的位置是确定的)

# 在a.py中定义了一个test属性
test = 5
print(test, id(test))
test = 6
print(test, id(test)) 结果
C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/a.py
5 1795613520
6 1795613536 Process finished with exit code 0

不可变类型

下面写四个脚本,验证import的 导入对象的属性 是不可变类型的修改,jia.py是导入了b.py和c.py两个模块,并运行,(千万不要起abc.py,它是内置模块)

 # 在a.py中定义了一个test属性
test = 2
print('in a')

a.py

import a
# 引用了a.py模块,是整个模块的引用
print('first print in b.py', a.test)
a.test = 3
print('second print in b.py', a.test) ''' 注意区分模块和包的含义
模块就是一个x.py的程序
包是包含许多xx.py程序的文件夹(该文件夹中必须有__init__.py程序)
'''

b.py

import a
# 引用了a.py模块
print('first print in c.py', a.test) a.test = 4
print('second print in c.py', a.test)

c.py

# abc.py是python内置模块的名字,脚本名字别乱起
import b
import c
print('first print in jia.py', b.a.test)
print('second print in jia.py', c.a.test)

jia.py

C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/jia.py
in a
first print in b.py 2
second print in b.py 3
first print in c.py 3
second print in c.py 4
first print in jia.py 4
second print in jia.py 4 Process finished with exit code 0

jia.py的运行结果

b.py中second print和c.py中first print输出都是3,说明b.py已经修改了模块的属性

下面再写四个脚本,验证from xx import x 能不能对模块的不可变类型属性修改,jia.py是导入了b.py和c.py两个模块,并运行。

# 在a.py中定义了一个test属性
test = 2
print('in a')

a.py

from a import *
# 引用了a.py模块,是整个模块的引用
print('first print in b.py', test)
test = 3
print('second print in b.py', test)

b.py

from a import *
# 引用了a.py模块
print('first print in c.py', test) test = 4
print('second print in c.py', test)

c.py

# abc.py是python内置模块的名字,脚本名字别乱起
import b
import c
print('first print in jia.py', b.test)
print('second print in jia.py', c.test)

jia,py

C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/jia.py
in a
first print in b.py 2
second print in b.py 3
first print in c.py 2
second print in c.py 4
first print in jia.py 3
second print in jia.py 4 Process finished with exit code 0

jia.py的运行结果

b.py中second print和c.py中first print输出一个是3一个是2,说明b.py没有修改了模块的属性

下面再写四个脚本,验证from xx import x 能不能对模块的可变类型属性修改,jia.py是导入了b.py和c.py两个模块,并运行。

# 在a.py中定义了一个test属性
test = [1, 2]
print('in a')

a.py

from a import *
# 引用了a.py模块,是整个模块的引用
print('first print in b.py', test)
test.append('b')
print('second print in b.py', test) ''' 注意区分模块和包的含义
模块就是一个x.py的程序
包是包含许多xx.py程序的文件夹(该文件夹中必须有__init__.py程序)
'''

b.py

from a import *
# 引用了a.py模块
print('first print in c.py', test) test.append('c')
print('second print in c.py', test)

c.py

# abc.py是python内置模块的名字,脚本名字别乱起
import b
import c
print('first print in jia.py', b.test)
print('second print in jia.py', c.test)

jia.py

C:\Users\jackendoff\AppData\Local\Programs\Python\Python36-32\python.exe D:/pycharm_project/test_import/jia.py
in a
first print in b.py [1, 2]
second print in b.py [1, 2, 'b']
first print in c.py [1, 2, 'b']
second print in c.py [1, 2, 'b', 'c']
first print in jia.py [1, 2, 'b', 'c']
second print in jia.py [1, 2, 'b', 'c'] Process finished with exit code 0

jia.py的运行结果

b.py中second print 和 c.py中first print 输出的都是[1, 2, 'b'],说明b.py已经修改了模块的属性

总结:使用import xx 可以修改模块对象的属性(无论属性是不是可变类型)

      使用from xx import x 只能修改模块对象的属性是可变类型的(不可变类型不能修改)

这也是为甚麽,尽量不要使用 from XX import * 的原因,会发生属性错误,

这也是为什么,导入模块需要写在程序开头的位置,并且先导入内置模块,再导入库模块,再导入自定义模块

python import xx和from xx import x 中的坑的更多相关文章

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

    有如下脚本script1.py: A='aaaa'B='bbbb'C='cccc'print A,B,C 1.命令行交互模式下使用import 导入方式1: >>>import sc ...

  2. import * as obj from 'xx'

    import * as obj from 'xx'  这种写法是把所有的输出包裹到obj对象里 例如: xx里中: export function hello(){ return '我是hello 内 ...

  3. import * as x from 'xx' 和 import x from 'xx'

    普通xx.js文件 //不可变的依赖模拟数据 module.exports=[ { id: "d52dccfc-656d-11e8-b153-7cd30ad3aa7a", regi ...

  4. import xxx和from xxx import xx中修改被导入模块里面的变量的坑

    现在有如下几个模块: A.py 功能:定义全局变量,供其他模块使用 name = "张三" lists = [1, 2, 3, 4, 5] B.py 功能:打印A.py中的变量 f ...

  5. Python学习第二阶段,Day2,import导入模块方法和内部原理

    怎样导入模块和导入包?? 1.模块定义:代码越来越多的时候,所有代码放在一个py文件无法维护.而将代码拆分成多个py文件,同一个名字的变量互不影响,模块本质上是一个.py文件或者".py&q ...

  6. Python: import vs from (module) import function(class) 的理解

    Python: Import vs From (module) import function(class) 本文涉及的 Python 基本概念: Module Class import from . ...

  7. python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)

    一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...

  8. Python import用法以及与from...import的区别

    Python import用法以及与from...import的区别 在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的 ...

  9. Python工程:ImportError: attempted relative import with no known parent package

    Python工程:ImportError: attempted relative import with no known parent package 解决方法: 1.对每个目录创建的时候都选择创建 ...

  10. Python的import module与form module import的区别

    import moduleName 如果要使用moduleName模块中的方法时,是moduleName.method(点方法), 比如moduleName中有个方法是set,则使用的是moduleN ...

随机推荐

  1. 二十五、SAP中输出一条横线

    一.我们代码如下,这个是不输出横线的时候 效果如下 二.输出横线的代码如下 效果如下,多出一条横线

  2. 导出execl

    string filepath = Utils.GetMapPath("/upload/excel/"); filepath = filepath + fileName + &qu ...

  3. Bean XML 配置(1)- 通过XML配置加载Bean

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  4. E. Third-Party Software - 2 贪心----最小区间覆盖

    E. Third-Party Software - 2 time limit per test 2.0 s memory limit per test 256 MB input standard in ...

  5. OpenCV学习日志:计算机视觉资源汇总

    1.1 重要会议 (1)机器视觉重要会议 CVPR:Conferenceon Computer Vision and Pattern Recognition, IEEE, 五星 ICCV:Intern ...

  6. 《百面机器学习算法工程师带你去面试》高清PDF及epub+《美团机器学习实践》PDF及思维导图

    http://blog.sina.com.cn/s/blog_ecd882db0102yuek.html <百面机器学习算法工程师带你去面试>高清PDF及epub+<美团机器学习实践 ...

  7. 14 ~ express ~ 显示用户数据

    一,router/admin.js var express = require('express') var router = express.Router() var User = require( ...

  8. 大数据高可用集群环境安装与配置(06)——安装Hadoop高可用集群

    下载Hadoop安装包 登录 https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ 镜像站,找到我们要安装的版本,点击进去复制下载链接 ...

  9. 修改虚拟机ip

    在命令行里输入:more  /etc/sysconfig/network-scripts/ifcfg-eth0 (注意more后要空一格,还有eth0,最后是数字零).  然后再输入:ifconfig ...

  10. 剑指offer_1.18_Day_2

    怠惰怠惰,好好练练了要 二维数组中查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 ...