cor*_*zza 51 python import module
我有两个特定的情况,我不明白导入如何在Python中工作:
第一个具体情况:
当我在两个不同的Python脚本中导入相同的模块时,模块不会导入两次,对吧?Python第一次遇到它时,会导入它,第二次检查模块是否已导入,还是复制了?
第二个具体情况:
考虑以下模块,称为bla.py:
a = 10
Run Code Online (Sandbox Code Playgroud)
然后,我们有foo.py一个导入的模块bla.py:
from bla import *
def Stuff ():
return a
Run Code Online (Sandbox Code Playgroud)
之后,我们有一个名为的脚本bar.py,由用户执行:
from foo import *
Stuff() #This should return 10
a = 5
Stuff()
Run Code Online (Sandbox Code Playgroud)
在这里我不知道:Stuff()返回10还是5?
Thi*_*ter 62
第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:
以下构建体结合的名称:正式函数的参数,导入语句,类和函数定义(这些结合在定义块的类或功能名称),目标是标识符,如果在分配发生,对于循环头,在第二except子句的位置或者在with语句之后的位置.
两个粗体部分与您相关:首先,名称a绑定到foo.a导入期间的值.然后,在做的时候a = 5,名称a被绑定5.由于修改list/dict不会导致任何绑定,因此这些操作将修改原始操作(b并且foo.b绑定到您操作的同一对象).分配一个新的对象b将再次装订操作,从而分开b从foo.b.
值得注意的是import声明究竟是做什么的:
import foo将模块名称绑定到当前作用域中的模块对象,因此如果修改foo.whatever,您将使用该模块中的名称 - 任何修改/赋值都将影响模块中的变量.from foo import bar仅将给定名称(foo即将保持未绑定)绑定到具有相同名称的元素foo- 因此操作的bar行为与之前解释的相同.from foo import *行为与前一个相似,但它导入所有未加下划线前缀的全局名称.如果模块__all__仅定义了此序列中的名称,则导入.第3部分(在你的问题中甚至不存在:p)
python文档非常好,通常很冗长 - 你可以在那里找到几乎所有与语言相关的问题的答案.以下是一些有用的链接:
import,yield)for,try,with)| 归档时间: |
|
| 查看次数: |
24288 次 |
| 最近记录: |