Python模块中的范围

use*_*151 0 python python-3.x

我有一个模块代码:

X = 88 
def f():
    global X 
    X = 99
Run Code Online (Sandbox Code Playgroud)

另一个使用此模块的文件:

from First import X,f
X = 11
f()
print(X)
Run Code Online (Sandbox Code Playgroud)

现在根据我的理解,因为我们明确地导入符号x和f,它们应该成为导入模块命名空间的一部分.

并且因为函数f改变了全局X. 答案应该是99.

但事实似乎并非如此,因为输出为11.

请帮我理解为什么?

Mar*_*ers 7

通过使用from module import ...语法,您可以创建名称,这些名称绑定到与原始模块中的名称相同的对象.这些名字是独立的.

导入后你有这个:

First.X ----\
             |--> 88
another.X --/
Run Code Online (Sandbox Code Playgroud)

然后你another.X 设置为11,所以你有这个:

First.X --------> 88

another.X ------> 11
Run Code Online (Sandbox Code Playgroud)

在你打电话之后f(),你有这个:

First.X --------> 99

another.X ------> 11
Run Code Online (Sandbox Code Playgroud)

你可以改为导入模块; 绑定名称First以指向模块对象:

import First
first.X = 11
first.f()
print(first.X)
Run Code Online (Sandbox Code Playgroud)

现在所有代码都First.X只能运行.

您可能想要了解Python名称和对象的工作原理.