当前位置: 首页 > 面试题库 >

Python导入是如何工作的?

姜淇
2023-03-14
问题内容

我有两种不了解如何在Python中进行导入的特定情况:

第一种具体情况:

当我在两个不同的Python脚本中导入同一模块时,该模块不会被导入两次,对吗?Python第一次遇到它时,将其导入,第二次它是否检查该模块是否已导入,或者是否进行了复制?

第二种具体情况:

考虑以下模块,称为bla.py

a = 10

然后,我们有foo.py个模块,该模块导入bla.py

from bla import *

def Stuff ():
    return a

之后,我们有一个名为的脚本bar.py,该脚本由用户执行:

from foo import *
Stuff() #This should return 10 
a = 5
Stuff()

在这里我不知道:Stuff()返回10还是5?


问题答案:

第1部分

该模块仅加载一次,因此再次导入不会造成性能损失。如果您确实希望再次加载/解析它,则必须使用reload()该模块。

首先检查的是sys.modules,以前已导入的所有模块的缓存。[来源]

第2部分

from foo import *导入a本地范围。将值分配给时a,它将替换为新值-但foo.a不会触及原始变量。

因此,除非您import foo进行修改foo.a,否则两个调用将返回相同的值。

对于可变类型(例如列表或字典),它会有所不同,对其进行修改确实会影响原始变量-但为其分配新值仍不会修改foo.whatever

如果您需要更多详细信息,请访问http://docs.python.org/reference/executionmodel.html:

以下构造绑定名称:函数的形式参数, import语句 ,类和函数定义(这些绑定在定义块中的类或函数名称),以及
目标(如果在赋值中出现的话,则是标识符 )的 目标 ,用于第二个循环头except子句标题的位置或在with语句之后。

与您相关的两个粗体部分:首先,名称与导入期间的a值绑定foo.a。然后,在执行操作时a = 5,名称a将绑定到5。由于修改列表/字典不会引起任何绑定,因此这些操作将修改原始操作(bfoo.b绑定到要操作的同一对象)。分配一个新的对象b将再次装订操作,从而分开bfoo.b

还值得注意该import语句的确切作用:

  • import foo将模块名称绑定到当前作用域中的模块对象,因此,如果您进行修改foo.whatever,则将使用该模块中的名称-任何修改/赋值都会影响模块中的变量。
  • from foo import bar仅将给定名称foo绑定到(即将保持未绑定状态)到具有相同名称的元素中foo-因此对的操作bar行为如前所述。
  • from foo import *行为与上一个类似,但是它导入所有不带下划线前缀的全局名称。如果模块__all__仅定义此序列内的名称,则将导入。

第3部分 (甚至在您的问题中都不存在:p)

python文档非常好,而且通常很冗长-您可以在其中找到几乎所有与语言相关的问题的答案。以下是一些有用的链接:

  • http://docs.python.org/reference/datamodel.html(类,属性,魔术方法等)()
  • http://docs.python.org/reference/executionmodel.html(变量如何在python中工作)
  • http://docs.python.org/reference/expressions.html
  • http://docs.python.org/reference/simple_stmts.html(如的语句importyield
  • http://docs.python.org/reference/compound_stmts.html(块语句,例如fortrywith


 类似资料:
  • 问题内容: 假设我有以下文件, 现在,如果我跑步,它说。 这是有道理的,并且按照此链接中的以下语句运行: “它将首先在包的目录中查找” 假设我稍微修改了文件结构(添加了一个核心目录): 现在,如果我运行,它将加载内置模块。 同样在第二种情况下,如果必须遵守“ 它将首先在软件包的目录中查找 ” 这样 的语句 ,是否 应该加载本地文件,因为它是“软件包的目录”? 我的术语“包目录”的意义是 明确 的

  • 问题内容: 我一直在挣扎着我的第一个正则表达式。在编译,并不断得到错误。 我只是更改为,它的工作就像一个梦。 我的印象是,荷兰国际集团将 同时 在带来等等那是不是这样的?我找不到解决此特定问题的任何文档。 问题答案: 是的,这就是Java中包导入的工作方式(应该如此)。例如,doing 将导入所有 类 ,但 不 导入子包及其类。 人机工程学,将 不会 导入或 阅读以下博客,获得一些友好的新手建议。

  • 我的python版本是3.5通过Anaconda在Windows 10环境。我使用Pyminizip是因为我需要对我的zip文件进行密码保护,而Zipfile还不支持它。 我能够通过函数压缩单个文件,并且加密函数按预期工作。但是,当尝试使用时,我总是遇到Python崩溃(如图片所示),我相信这是由于我的错误输入格式的问题。 我想知道的是:输入参数的可接受格式是什么?来自Pyminizip的文档:

  • 目前通过手机号来标识员工,同一个手机号只能出现在一个公司内。当员工已经在一个公司而其他公司需要添加该员工时,该员工会进入其他公司的待确认列表,等待员工的确认操作。员工可以通过以下方式加入企业: 管理员主动导入员工 1. 逐条新增 2. 批量新增 ① Excel批量上传 ②手机通讯录批量导入 管理员邀请员工加入 1. 邮箱邀请 2. 二维码邀请(链接邀请)

  • 我第一次安装pymongo时使用的是easy_install,但它不起作用,所以我尝试使用pip,但仍然失败。 这在航站楼很好: 但是在我剧本的第10行 引发以下错误: 文件“test.py”,第10行, 我使用Apache和Python的标准Lion构建。还有其他人经历过吗? 谢谢 编辑:我还应该提到,在安装过程中,它抛出以下错误 然后接着说 非常奇怪。 我的系统。脚本中的路径返回为: ['/库

  • 应用程序具有上下文路径-->/spring-form-simple-project 因此,为了访问,我使用: 这个控制器又返回student.jsp,当提交这个student.jsp时,它用-->@RequestMapping(value=“/AddStudent”,method=RequestMethod.post)调用controller 任何关于这通常如何工作的指示都将是有帮助的。 谢谢!