为什么全局变量不能像导入时那样工作?

dmd*_*dmd 6 python variables scope

在文件中foo.py我有这个:

d = {}
d['x'] = 0
x = 0

def foo():
    global d
    global x
    d['x'] = 1
    x = 1
Run Code Online (Sandbox Code Playgroud)

然后在翻译中:

>>> from foo import *
>>> d['x']
0
>>> x
0
>>> foo()
>>> d['x']
1
>>> x
0
Run Code Online (Sandbox Code Playgroud)

我期待这个:

>>> x
1
Run Code Online (Sandbox Code Playgroud)

我不明白的是什么?

mgi*_*son 3

的全局命名空间foo仅导入到当前命名空间一次(当您执行 时from foo import *)。之后,如果您更改 的foo命名空间,它将不会反映在您当前的命名空间中。

请注意,您仍然可以更改 的foo命名空间中的对象并查看当前命名空间中的更改。这就是为什么您会看到d. d您仍然拥有对位于foo的命名空间中的同一对象的引用。

但是,当你设置:

x = 1
Run Code Online (Sandbox Code Playgroud)

这会在 的命名空间中重新绑定foo一个新对象。

  • 所以 `foo` 中引用的“全局变量”实际上是 `foo.d` 和 `foo.x`,而不是 `__main__.d` 和 `__main__.x`(尽管 `__main__.d` 和 `foo.d`引用同一个对象),虽然 `foo.x` 现在的值为 1,但 `__main__.x` 仍然是 0。 (2认同)