Visibility of global variables in imported modules

前端 未结 8 1915
梦毁少年i
梦毁少年i 2020-11-22 11:22

I\'ve run into a bit of a wall importing modules in a Python script. I\'ll do my best to describe the error, why I run into it, and why I\'m tying this particular approach t

8条回答
  •  无人共我
    2020-11-22 11:55

    Globals in Python are global to a module, not across all modules. (Many people are confused by this, because in, say, C, a global is the same across all implementation files unless you explicitly make it static.)

    There are different ways to solve this, depending on your actual use case.


    Before even going down this path, ask yourself whether this really needs to be global. Maybe you really want a class, with f as an instance method, rather than just a free function? Then you could do something like this:

    import module1
    thingy1 = module1.Thingy(a=3)
    thingy1.f()
    

    If you really do want a global, but it's just there to be used by module1, set it in that module.

    import module1
    module1.a=3
    module1.f()
    

    On the other hand, if a is shared by a whole lot of modules, put it somewhere else, and have everyone import it:

    import shared_stuff
    import module1
    shared_stuff.a = 3
    module1.f()
    

    … and, in module1.py:

    import shared_stuff
    def f():
        print shared_stuff.a
    

    Don't use a from import unless the variable is intended to be a constant. from shared_stuff import a would create a new a variable initialized to whatever shared_stuff.a referred to at the time of the import, and this new a variable would not be affected by assignments to shared_stuff.a.


    Or, in the rare case that you really do need it to be truly global everywhere, like a builtin, add it to the builtin module. The exact details differ between Python 2.x and 3.x. In 3.x, it works like this:

    import builtins
    import module1
    builtins.a = 3
    module1.f()
    

提交回复
热议问题