Python在2.7中以不同的方式设置全局变量

时间:2016-09-17 07:28:12

标签: python scope

我正在尝试使用diff方法练习与设置全局变量相关的概念,但以下示例并不符合我的理解。

#Scope.py

    import os
    x = 'mod' 

    def f1() :
        global x
        x = 'in f1'

    def f2() :
        import scope
        scope.x = 'in f2'

    def print_x() :
        print x

    def f3() :
        import sys
        sc = sys.modules['scope']
        sc.x =  'in f3'




    if __name__  == "__main__" :
        f1()
        print_x()
        f2()
        print_x()
        f3()
        print_x()

它给出了以下结果

in f1
in f1
in f1

虽然根据我的理解,它导致了

in f1
in f2
in f3

有人可以帮我理解我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

查看这段修改过的代码。

x = 'mod'


def f1():
    global x
    x = 'in f1'


def f2():
    import scope
    scope.x = 'in f2'
    return scope


def print_x():
    print(x)


def f3():
    import sys
    sc = sys.modules['__main__']
    sc.x = 'in f3'
    return sc


if __name__ == "__main__":
    f1()
    print_x()
    sc = f2()
    print_x()
    print(sc.x)
    sc = f3()
    print_x()
    print(sc.x)

问题在于,在原始f2()中,您实际导入名称为scope的{​​{1}}模块并修改其变量。在scope之后,您引用print_x()中未更改的x。在__main__中,您使用错误的名称引用模块:要修改它,您应该在此使用f3()。使用__main__,您实际上引用了scope中导入的模块(尝试删除f2()来电)...这显然不是您想要的。