Python导入函数中的'globals'和'locals'参数用于什么?

Python导入函数中的'globals'和'locals'参数用于什么?,python,import,Python,Import,Python文档中有一部分我不理解: \uuuu导入(名称[,全局[,局部[,来自列表[,级别]]]) 函数导入模块名称,可能使用给定的全局和局部来确定如何在包上下文中解释名称。标准实现根本不使用其locals参数,而仅使用其globals来确定导入语句的包上下文 模块名有什么可“解释”的?什么是包上下文 使用这些参数的示例调用如下所示: spam = __import__('spam', globals(), locals(), [], -1) 为什么示例为函数提供了globals()和lo

Python文档中有一部分我不理解:

\uuuu导入(名称[,全局[,局部[,来自列表[,级别]]])

函数导入模块
名称
,可能使用给定的
全局
局部
来确定如何在包上下文中解释
名称
。标准实现根本不使用其
locals
参数,而仅使用其
globals
来确定导入语句的包上下文

模块名有什么可“解释”的?什么是包上下文

使用这些参数的示例调用如下所示:

spam = __import__('spam', globals(), locals(), [], -1)
为什么示例为函数提供了
globals()
locals()
?如果我只提供
globals()
,会发生什么情况?或者两者都没有

我可能缺少与导入模块相关的命名空间逻辑的某些部分。你能给我指一篇文章来解释这一点吗?它有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

标准实现根本不使用其
locals
参数,而仅使用其
globals
来确定
import
语句的包上下文

(来自)

我仍然不知道如何使用
globals
;什么全局变量会影响
import
语句的工作方式

EDIT:在查看Python 2.5源代码中的
import.c
后,我发现
\uuuuuuuuuuuuuu
期望在
globals
中找到
\uuuuuuuuuuu name>或
\uuuuuuuuuuuuuuuuuuuuuuuuuu路径>以增加相对于在这些变量中找到的路径的导入搜索路径

模块名有什么可“解释”的?什么是包上下文

当你进入

>>> a
Python必须“解释”这个名称。这是一个全球性的问题吗?是本地的吗

>>> def f(x):
...    return x * a
现在,
x
显然是本地的<代码>必须进行“解释”。全球的?本地的

为什么示例为函数提供globals()和locals()?当我只提供globals()时会发生什么?或者两者都没有

试试看。认真地玩它比问它容易

重要的是,您在
>>
提示符下所做的事情是全局性的


您需要定义将创建本地上下文的函数,以便查看全局上下文和本地上下文之间的差异。

globals
用于确定调用导入的当前上下文。例如:

"""
/myproject/a/b.py
/myproject/a/foo.py
/myproject/c/d.py
/myproject/c/foo.py
"""

# Which foo gets imported?

import foo #1
foo = __import__('foo') #2
它们不一样,因为在#2上没有(简单的)方法知道从哪个模块调用导入。
\uuuu import\uuuu
函数需要知道实际导入正确的
foo
的当前模块

\uuuuu import\uuuuuu()
内部,使用
globals
获取调用导入的当前模块上的引用。从
\uuuu导入\uuuuu

返回正在其中执行导入的包。如果globals来了 从模块foo.bar.bat(本身不是包)返回 foo.bar的sys.modules条目。如果globals来自包的init.py, 返回sys.modules中的包条目,作为借用的引用


这个问题不应该转移到StackOverflow吗?这很有趣,我是在SO开始写这篇文章的,但我正在考虑是否应该把它发布到programmers.SE上。。。我显然需要看看常见问题解答…您应该选择以下答案之一作为此问题的公认答案。IMHO,9000的答案一针见血,它解释了Python如何使用
globals
来确定模块名称空间。残酷有趣的事实是,正在导入的模块几乎忽略了进行导入的模块的全局值,而
\u import\u
完全忽略了
locals
参数。否则,您是正确的:)假设在
b.py
d.py
中有
import foo
。Python怎么不知道要导入哪一个?在
b.py
的情况下,为什么它会在
/c
/中查找
foo
?如果在
/myproject/e.py
中有
导入foo
,那么它就不应该工作。
import a.foo
import c.foo
。我很抱歉。。。我似乎无法举出一个会“制造麻烦”的例子,你能给我一个提示吗?谈谈迟钝。因此,基本上,不需要传递包含所有全局变量的巨大内存块(假设Python不通过引用来传递),只需传递一个dict键,
“\uuuuu name\uuuuu”
,设置为调用模块的
\uu name\uuuuu
属性,Python就可以使用它。Python文档应该用这些信息更新。@Kumba:假设Python除了一些基本的数字操作外,几乎所有操作都是通过引用来完成的。口述绝对是通过引用来传递的。Python3.3甚至引入了共享键的DICT实现,也就是说,键也是通过引用访问的。如果你想抱怨的话,那就谈谈缓存一致性:)在实际使用(并拥有)非缓存一致性硬件之后,我只能开始想象那场噩梦。谢天谢地(或者很遗憾,你可以选择),我用Python编写的代码必须至少在Python2.4上运行。我避免使用3.x,因为我知道它完全终结了语言,我的许多代码可能无法在没有认真重写的情况下工作。