先回顾一下理解程度

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

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

# 在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. 116-PHP调用类成员函数

    <?php class ren{ //定义人类 public function walk(){ //定义人类的成员方法 echo '我会走路.'; } } $ren=new ren(); //实 ...

  2. mysql多表连接查询

    新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键.) ...

  3. 日期月份是英文转成数字——oracle

    update table01 set F_DATE = to_char(to_date(F_DATE, 'dd-month-yy', 'NLS_DATE_LANGUAGE=AMERICAN'), 'y ...

  4. python_@propetry

    @propetry的作用就是让一个方法可以当成属性被调用. @property的实现比较复杂,我们先考察如何使用.把一个getter方法变成属性,只需要加上@property就可以了,此时,@prop ...

  5. C++ 大文件读写

    //你必须映射一个只包含一小部分文件数据的文件视图.首先映射一//个文件的开头的视图.当完成对文件的第一个视图的访问时,可以取消它的映像,然后映射//一个从文件中的一个更深的位移开始的新视图.必须重复 ...

  6. RFX2401C与RFX2402E的区别

    随着科技的发展,射频设备也慢慢的普及,射频放大器在射频设备中起着非常重要的作用.为了能获得足够大的距离,必须都要外加射频信号放大器. 射频信号放大器简称 “PA”.PA主流应用主要有ZigBee .无 ...

  7. mailx发送邮件

    cent6.5自带mailx   这是个第三方的邮件发送 比如用自己的126给其他账户发邮件 cent6.5还自带了postfix 可以停掉  sendmail(cent5才自带6是postfix)也 ...

  8. 由于找不到msvcp100.dll无法继续执行代码

    最近重装系统之后安装mysql, 执行 mysqld install 命令时出现 : 由于找不到msvcp100.dll无法继续执行代码... 解决办法 下载 Microsoft Visual C++ ...

  9. bzoj 4236JOIOJI

    一开始忘掉特殊情况也是蛋疼2333(有一直到头的.mp[0][0]是要特判的) 做法也就是找mp[i][j]相同的东西.(貌似可以写成线性方程组(z=x+A,z=y+B)过这个的就是相等(可以先从2维 ...

  10. 十一、CI框架之输出用户IP地址

    一.代码如下: 二.效果如下: 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.