首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第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原创,欢迎关注,带你一起长知识。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200710A05Z2500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券