Python全局命名空间和评估顺序

spe*_*son 1 python namespaces global

试试这个:

A = 1
B = 2
C = A + B

def main():
    global C
    print A
Run Code Online (Sandbox Code Playgroud)

输出main()1.

为什么是这样?为什么要main了解用于评估的其他全局变量C

Raf*_*ler 8

全局变量始终可用于Python中的所有本地作用域,包括函数.在这种情况下,内main() A,BC都在范围之内.

global关键字没有做什么,似乎你认为它; 相反,它允许局部范围操纵全局函数(它使全局变量"可写",可以这么说).考虑这些例子:

c = 4
print c
def foo():
    c = 3
    print c
foo()
print c
Run Code Online (Sandbox Code Playgroud)

在这里,输出将是

4
3
4
Run Code Online (Sandbox Code Playgroud)

现在,考虑一下:

c = 4
print c
def foo():
    global c
    c = 3
    print c
foo()
print c
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出将是

4
3
3
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,c = 3只有阴影c直到其范围为止(即函数定义结束时).在第二种情况下,我们实际上是指c在写完之后对全局的引用global c,因此更改值c将导致永久性更改.

  • 这个答案并不清楚"全局"是关于编写变量,而不是阅读它们. (2认同)