每个python文件就是一个模块、模块的名字就是_第39p,Python模块的名称空间问题,应该讲完了吧...

大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第39篇文章,第二阶段的课程:Python基础知识:Python中模块与包的概念与使用(下篇)。

学习本课程,建议先看一遍:【计算机基础知识】课程。

一、模块与包被调用时的名称空间问题

当一个xx.py文件被当成模块在另外的文件yy中被调用时,会在当前调用文件中产生一个模块名xx的名称空间,这个模块xx的名称空间指向着xx.py这个文件的内存地址;假设xx.py文件与yy.py这两个文件中都有着一个叫x的变量,这两个名称相同的变量x不会发生冲突;

因为如果要使用xx.py这个文件中变量x的值,必须是xx.x的方式获取到xx.py这个文件中变量x的值;如果要获取yy.py这个文件中x的值,只需要直接调用x即可;

但是,如果是使用了from xx import x 这样的语句,Python解释器会遵循优先原则,如果是先在yy.py文件中定义了x则,调用的是yy.py中的x;如果在yy.py文件中是先使用了变量x,然后又在xx.py文件中定义x则结果为xx.py中变量x的值;

读起来可能有点绕,请看下图:

其实就是遵循先定义后调用,调用时只调用就近变量原则!

二、模块与包第一次导入时发生的事情

1.执行xx.py文件,在被导入的模块所在文件中执行;

2.产生xx.py的名称空间,将xx.py运行过程中产生的名字都丢到新产生的模块xx的名称空间中;

3.在当前文件中产生一个名字xx,该名字指向xx.py的名称空间

注:只在首次导入发生这些事,之后的导入都是引用首次导入产生的名称空间,不会重复产生名称空间;包和模块类似,只是包的名称空间是基于__init__.py文件产生的。

三、导入包需要注意的事项

1、避免import * 导入方式

在一些包中会有非常多的模块,有时候我们需要用到比较多的模块,所以我们使用“from xx import * ”这样的语句导入了所有功能;这种方式虽然比较方便,但我们需要注意的是,如果xx中有个变量x,而yy文件中也有一个变量x,有时候会引起因为称一致,导致我们并不清楚我们使用变量x的时候到底用的是哪个文件中的x。

2、循环导入问题

即在x文件中导入y,然后又在y文件中导入x,这样就会形成一种相互循环导入的问题;这是一种非常垃圾的代码写法,请务必避免这种循环导入的问题发生。

3、使用from xx.y import z导入的问题

我们在使用from导入时,可能会出现一个包内有子包,子包内有子子包,最终在子子包里面才是我们需要用的的功能,所以会出现这样的导入方式:

比如:from 包.子包.子子包 import 功能

这里有使用from导入时必须注意:【重点】from关键字后面导入的内容,点(.)的左侧必须是一个包,而不能是一个py文件;

比如:from 包名.功能名  import 子功能

这样使用from关键字导入包功能一定会发生报错,这是Python的语法强制规定的,from关键字后面导入的内容,点的左侧必须是一个包,即必须是一个文件夹,而不能是一个文件。

如图所示:

以上是本期内容,如果有表达不对的内容,欢迎您的留言、斧正,我们一起天天向上。

感谢您的阅读,您的关注点赞就是对我最大的支持,谢谢!

本文由杨数Tos原创,欢迎关注,带你一起长知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值