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

时间:2011-10-31 01:23:57

标签: python namespaces global

试试这个:

A = 1
B = 2
C = A + B

def main():
    global C
    print A

main()的输出为1

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

2 个答案:

答案 0 :(得分:8)

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

global关键字不会像您认为的那样做;相反,它允许局部范围操纵全局函数(它使全局变量“可写”,可以这么说)。请考虑以下示例:

c = 4
print c
def foo():
    c = 3
    print c
foo()
print c

此处输出为

4
3
4

现在,请考虑一下:

c = 4
print c
def foo():
    global c
    c = 3
    print c
foo()
print c

在这种情况下,输出将是

4
3
3

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

答案 1 :(得分:4)

函数可以读取封闭范围内的变量。 global declaration用于编写变量(表示它们应该写入全局字典而不是本地字典)。