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 ...
随机推荐
- 四十四、在SAP中冻结第一行表头
一.表格数据量大了,如果需要界面滚动,则看不到第一行的表头文本 二.代码如下: 二.效果如下,任意滚动,表头还是被冻结可以看到
- 065-PHP函数中声明全局变量
<?php function test(){ //定义函数 global $a; //声明全局变量 $a=7; echo "函数内: ".$a . "<br& ...
- opencv 读写XML YML
//序列没有标签 CvMemStorage *mem = cvCreateMemStorage(0); CvFileStorage *file = cvOpenFileStorage("e: ...
- 从零开始Windows环境下安装python+tensorflow
从零开始Windows环境下安装python+tensorflow 2017年07月12日 02:30:47 qq_16257817 阅读数:29173 标签: windowspython机器学习te ...
- 【LeetCode】课程表
[问题]现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程.例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量 ...
- springboot + shiro+登录 微信登录 次数验证资料
分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助,点击查看教程. 1.https://blog.csdn.net/xtiawxf/article/details/5 ...
- 剑指offer题目汇总
二维数组中的查找 题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中 ...
- MySQL日志--二进制日志
(一)什么是二进制日志 二进制日志(binlog)记录了数据库中所有的DDL和DML操作,但是不包括select语句,语句以"事件"的形式保存,记录了数据库的更改变化,在主从复制( ...
- 利用kindlegen实现txt格式小说转换为mobi格式小说(C++实现)
一直以来喜欢在kindle上看小说,kindle不伤眼,也可以帮助控制玩手机的时间.但在kindle上看txt格式的网络小说就很头疼了,这类小说在kindle上是没有目录的,而且篇幅巨长.所以一直以来 ...
- 关于spring cloud “Finchley.RC2”版本在spring cloud config中的ArrayIndexOutOfBoundsException
原文 https://www.cnblogs.com/Little-tree/p/9166382.html 在学spring cloud config的时候遇到一个ArrayIndexOutOfBou ...