python教程—Python导入究竟是如何工作的?-Python实用宝典

python教程—Python导入究竟是如何工作的?

我有两种具体的情况,我不明白在Python中导入是如何工作的:

我有两种特殊的情况,我不明白在Python中导入是如何工作的:

<强>具体情况1:< /强>

当我在两个不同的Python脚本中导入同一个模块时,这个模块不会被导入两次,对吧?Python第一次遇到它时,它会被导入,第二次时,它会检查模块是否被导入,还是进行复制?

<强>具体情况2:< /强>

考虑以下模块,称为bra .py:

    a = 10

然后是foo。py,一个导入bra .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部分

模块只加载一次,因此再次导入它不会造成性能损失。如果您真的希望再次加载/解析它,您必须重新加载()模块。

首先检查的是sys。模块,以前导入的所有模块的缓存。<一口> (< a href = " http://docs.python.org/reference/simple_stmts.html进口”rel = " noreferrer " > < / >来源]< /一口>


<强> < /强>第2部分

从foo import *导入a到本地范围。当将一个值赋给a时,它将被替换为新的值——但是是原来的foo。未触及变量。

除非你导入和修改foo。a,两个调用将返回相同的值。

对于一个可变类型,如列表或dict,它将是不同的,修改它确实会影响原始变量——但是为它分配一个新值仍然不会修改foo.whatever。

如果您需要更详细的信息,请查看http://docs.python.org/reference/executionmodel.html:

以下结构绑定名称:形式参数函数,<强> import语句< / >强,类和函数定义(这些绑定定义的类或函数名块),和<强>目标标识符,如果发生在一个赋值< / >强,for循环头,在第二位置的除外条款标题或之后在一个声明中。

两个粗体部分对您来说是相关的:首先名称a绑定到foo的值。a在进口期间。然后,当a = 5时,名称a被绑定到5。由于修改list/dict不会导致任何绑定,所以这些操作将修改原始的list/dict (b和foo)。b与您操作的对象绑定在一起)。将一个新对象赋值给b将再次是一个绑定操作,从而将b与foo.b分开。

同样值得注意的是import语句的作用:

  • import foo将模块名绑定到当前作用域中的模块对象,因此如果您修改了foo。无论如何,您将使用该模块中的名称—任何修改/分配都会影响模块中的变量。
  • 从foo导入bar只绑定给定的名称(即foo将保持未绑定)到foo中具有相同名称的元素——所以bar上的操作就像前面解释的那样。
  • 从foo import *的行为与前一个类似,但是它导入了所有不带下划线前缀的全局名称。如果模块定义了……all__,那么只导入序列中的名称。

Part 3(在你的问题中根本不存在:p)

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

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论