【问题标题】:Python global namespaces and evaluation orderPython 全局命名空间和评估顺序
【发布时间】:2011-10-31 01:23:57
【问题描述】:

试试这个:

A = 1
B = 2
C = A + B

def main():
    global C
    print A

main() 的输出是1

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

【问题讨论】:

    标签: python namespaces global


    【解决方案1】:

    全局变量始终可用于 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,直到其作用域结束(即函数定义结束时)。在第二种情况下,我们实际上是在编写 global c 之后引用了对全局 c 的引用,因此更改 c 的值将导致永久更改。

    【讨论】:

    • 这个答案并没有清楚地表明“全局”是关于写入变量,而不是关于读取它们。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      • 2012-08-22
      • 1970-01-01
      相关资源
      最近更新 更多