python import xx和from xx import x 中的坑
先回顾一下理解程度
什么是不可变类型和可变类型?
可变类型是,修改变量后 引用的内存地址不变,引用的内存中的内容发生变化(是针对变量名的引用来理解)。
# 在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 中的坑的更多相关文章
- python import xxx 与 from xxx import xx 模块引入的区别
有如下脚本script1.py: A='aaaa'B='bbbb'C='cccc'print A,B,C 1.命令行交互模式下使用import 导入方式1: >>>import sc ...
- import * as obj from 'xx'
import * as obj from 'xx' 这种写法是把所有的输出包裹到obj对象里 例如: xx里中: export function hello(){ return '我是hello 内 ...
- import * as x from 'xx' 和 import x from 'xx'
普通xx.js文件 //不可变的依赖模拟数据 module.exports=[ { id: "d52dccfc-656d-11e8-b153-7cd30ad3aa7a", regi ...
- import xxx和from xxx import xx中修改被导入模块里面的变量的坑
现在有如下几个模块: A.py 功能:定义全局变量,供其他模块使用 name = "张三" lists = [1, 2, 3, 4, 5] B.py 功能:打印A.py中的变量 f ...
- Python学习第二阶段,Day2,import导入模块方法和内部原理
怎样导入模块和导入包?? 1.模块定义:代码越来越多的时候,所有代码放在一个py文件无法维护.而将代码拆分成多个py文件,同一个名字的变量互不影响,模块本质上是一个.py文件或者".py&q ...
- Python: import vs from (module) import function(class) 的理解
Python: Import vs From (module) import function(class) 本文涉及的 Python 基本概念: Module Class import from . ...
- python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)
一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...
- Python import用法以及与from...import的区别
Python import用法以及与from...import的区别 在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的 ...
- Python工程:ImportError: attempted relative import with no known parent package
Python工程:ImportError: attempted relative import with no known parent package 解决方法: 1.对每个目录创建的时候都选择创建 ...
- Python的import module与form module import的区别
import moduleName 如果要使用moduleName模块中的方法时,是moduleName.method(点方法), 比如moduleName中有个方法是set,则使用的是moduleN ...
随机推荐
- Day 14:FileInputStream、FileOutputStream
File类: 用于描述一个文件或者文件夹的. 通过File对象我们可以读取文件或者文件夹的属性数据,如果我们需要读取文件的内容数据,那么我们需要使用IO流技术. IO流(Input Output) I ...
- python_re正则表达
re模块就本质而言,正则表达式(或RE)是一种小型的.高度专业化的编程语言,(在python中)它内嵌在Python中,并通过re模块实现,正则表达式模块被编译成一系列的字节码,然后由用C编写的匹配引 ...
- sourcetree安装以及跳过sourcetree注册登录 - git仓库管理工具桌面版
腾讯软件下载:https://pc.qq.com/detail/17/detail_23237.html 官网下载:https://www.sourcetreeapp.com/ 下载完直接安装 ...
- Android之Intent相关知识
什么是Intent?Intent的作用? Intent是一个消息传递对象,我们可以通过它来启动其他组件或者在组件之间传递数据. 通过Intent启动其他组件 Intent可以用来启动Activity, ...
- DataStructuresAndAlogorithm--红黑树
简介 为了理解红黑树(red-black tree)是什么,首先需要知道二叉树. 定义1:二叉树是结点的有限集合,该集合或者为空集,或者是由一个根和两棵互不相交的,称为该根的左子树和右子树的二叉树组成 ...
- 面试官,不要再问我“Java虚拟机类加载机制”了(转载)
关于Java虚拟机类加载机制往往有两方面的 面试题:根据程序判断输出结果和讲讲虚拟机类加载机制的流程.其实这两类题本质上都是考察面试者对Java虚拟机类加载机制的了解. 面试题试水 现在有这样一道判断 ...
- C#后台执行JavaScript
方法一: Page.RegisterClientScriptBlock 方法 命名空間: System.Web.UI 这个方法现在已经过时.改用ClientScriptManager.Register ...
- 201771010123汪慧和《面向对象程序设计Java》第十二周实验总结
一.理论部分 1.在Java提供的GUI构建工具中可以分为组件和容器两类. 2.在Java中的组件有:按钮.标签.复选框.单选按钮.选择框.列表框.文本框.滚动条.画布.菜单. 3.在Java中的容器 ...
- Mac Eclipse 打包可执行jar文件
2 3 4 保存后 终端 cd 目录 java -jar xxxx.jar
- 刷题46. Permutations
一.题目说明 题目是46. Permutations,给一组各不相同的数,求其所有的排列组合.难度是Medium 二.我的解答 这个题目,前面遇到过类似的.回溯法(树的深度优先算法),或者根据如下求解 ...