python import相对引用和绝对引用
一句话描述:
绝对引用是在sys.path中去找
相对引用是通过__name__去找。
假如目录如下:
绝对引用:
python a/aa.py的时候到底发生了什么
这个时候sys.path.append会将执行文件所在的目录即 a/ 放在sys.path中。后面所有文件的import都会在这个目录下找。如果aa是这样的。
from bb import i
那么很明显可以找到在a/目录下找到bb
但是假如你运行的是python main.py
import a.aa
那么现在加入到sys.path的就是顶层目录TEST,在aa.py里面就找不到bb了,这时候aa.py需改成
from a.bb import i
相对引用
相对引用是在__name__这个变量中找的。
举例,如果aa.py改成如下:
print(__name__)
from .bb import i
我们运行python main.py
那么aa.py的__name__此时就是a.aa
这时候aa.py中如果使用相对引用.bb,就会找到__name__倒数第一个.之前的目录a,然后在系统路径中去找这个a,如果能找到就可以导入,找不到就不能导入。很显然目前的系统路径可以找到a
如果我们运行python a/aa.py,情况会怎么样呢
此时__name 的值为__main
很显然这时候如果使用相对引用,根本找不到.,也就是根本知道parent目录是谁,因此会报错
ImportError: attempted relative import with no known parent package
接下来假如cc.py
print(__name__)
from ..a.bb import i
此时 main.py里面导入cc
import a.aa
import c.cc
那么很明显cc.py的__name__是c.cc,然后导入相对引用的时候用了两个., 也就是说需要在__name__中向上寻找两个点,但是现在__name__只有一个.,因此这个时候会报:
ValueError: attempted relative import beyond top-level package
python import相对引用和绝对引用相关推荐
- python变量回收_Python变量的引用、拷贝和回收机制
1.Python中变量的引用 Python中的变量都是指针,都是某个内存对象的引用. python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是"传对象引用" ...
- c++ 将引用赋值给引用_5分钟掌握 Python 对象的引用
1. 引言 引用在各种编程语言中都有涉及,如java中值传递和引用传递.python的对象引用也是学习python过程中需要特别关注的一个知识点,特别是对函数参数传递,可能会引起不必要的BUG.本文将 ...
- python中引用计数_Python引用计数操作示例
本文实例讲述了Python引用计数操作.分享给大家供大家参考,具体如下: 为了简化内存管理,Python通过引用计数机制实现了自动的垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对 ...
- python 引用计数 循环引用_Python对象的循环引用问题
Python对象循环引用 我们来介绍一下 Python 是采用何种途径解决循环引用问题的. 循环引用垃圾回收算法 上图中,表示的是对象之间的引用关系,从自对象指向他对象的引用用黑色箭头表示.每个对象里 ...
- Python的垃圾回收机制(引用计数+标记清除+分代回收)
一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...
- 求助,Python安装了Anaconda之后python自带的IDEL无法引用第三方库
求助,Python安装了Anaconda之后python自带的IDEL无法引用第三方库 本来一直是使用idel的,之前安装了一些第三方库现在也可以使用, 但是在安装了anaconda之后,自动安装了很 ...
- python一个对象只能被一个变量引用吗_python中的对象、变量、引用的问题
对象.变量.引用 对象 对象包括 不可变对象 和 可变对象.但从某种意义上来说,可变和不可变并不是对立关系. int,string,float,tuple 这四类属于 不可变对象.这里不可变的含义是: ...
- python赋值中文变量_Python变量引用赋值
不,你不能.正如其他答案所指出的,你可以(ab?)使用可变对象的别名来实现类似的效果.然而,这与C++引用不一样,我想解释一下实际上发生了什么,以避免任何误解.<>你可以看到,在C++(和 ...
- python中的值传递和引用传递
今天和大家分享python中很重要的一个知识点:参数传递,其中包括值传递和引用传递. 目录 一.为什么要熟悉值传递和引用传递 1.1 值传递 1.2 引用传递 二.Python变量及其赋值 三.Pyt ...
- 【python】对象释放,弱引用weaker.ref
class A:def __del__(self):print("in__del__")>>> a = A() >>> a = None in_ ...
最新文章
- 2021-2027年中国智能门禁系统市场研究及前瞻分析报告
- bzoj 2375: 疯狂的涂色
- docker 与tomcat整合
- Vulkan Video实现GPU加速视频编码/解码
- C/C++中手动获取调用堆栈【转】
- 【数据结构学习之完全从零实现所有数据结构的代码编写之一】泛型编程简介
- Linux: Nginx 安装
- NumPy数值计算库-1
- UML设计(团队作业)
- UHDTV (超高清电视)的色域与取样精度及格式
- 计算机毕业设计Java宠物医院管理系统(源码+系统+mysql数据库+lw文档)
- VBScript教程之一(Hello VBScriopt)
- 虚拟机桌面图标开机位置错乱的解决方法
- 1、Apache启动失败,请检查相关配置。2、MySQL5.1启动失败,请检查相关配置。
- 记录我在华为的经历----阿冬专栏
- 数模混合监控,视频如何联动报警、消防、门禁?
- 中电药明招募资深Python开发工程师
- 基于CNN-GRU-Attention混合神经网络的负荷预测方法(Python代码实现)
- 20172304 《程序设计与数据结构》 第二周学习总结
- GeckoDriver 国内镜像源加速下载