代码之家  ›  专栏  ›  技术社区  ›  deepbrook

通过Python中的global关键字从外部范围访问变量

  •  7
  • deepbrook  · 技术社区  · 8 年前

    按此规定 Question's accepted answer ,我理解我无法创建纯全局变量。好的,很酷。

    然而,他接着说:

    […]您所能做的就是在特定范围内生成变量。(如果您在Python解释器中创建一个变量,然后导入其他模块,那么您的变量位于最外面的范围内,因此在Pythin会话中是全局的。[…]

    好的,所以我们不能在原始意义上分配全局变量,但似乎可以通过 global 关键字,对吗?

    显然,我在努力访问通过命令行参数传递给我的python程序的变量时,遗漏了一些关键的东西。

    我的节目和往常一样 __main__.py ,它处理参数解析并执行我的python模块中的代码 backend .

    后端 具有依赖于通过命令行参数输入的代码。然而,我似乎无法使这些论点适用于 后端 .

    我的包的布局是:

    mypackage
    - __main__.py
    - backend/
        -__init__.py
        -direction.py
    

    这里是 __主__.py :

    import argparse
    
    # Setup ArgParser
    parser = argparse.ArgumentParser(description="Fancy Description of program.")
    parser.add_argument('--tar', nargs=1, dest='target',
                    help='Specify output folder.',
                    default=['/path/to/output'])
    
    target_dir = args.target[0]
    
    # Import backend now that our variable is set.
    from backend.direction import direction
    

    还有我的 backend/direction.py :

    global target_dir
    print(target_dir)
    

    运行此命令会引发一个 NameError: 'target_dir' is not defined . 那么大便在哪里? 我是在这里假设不可能,还是我只是把申报搞砸了?

    2 回复  |  直到 7 年前
        1
  •  16
  •   Brendan Abel    8 年前

    global 只能在使用它的模块内工作。你也不用 全球的 声明 全局范围内的全局变量(即模块范围)。你会用 全球的 在函数范围内,以指示您要在全局范围内而不是在本地范围内使用变量。

    在python 3中,还有 nonlocal 关键字,用于指示要修改外部范围中的变量 这不是全局/模块范围 .

    全球的

    A = 1
    
    def global_func():
        global A
        A = 2
    
    
    def func():
        A = 3
    
    
    print(A)
    # 1
    
    global_func()
    print(A)
    # 2
    
    func()
    print(A)
    # 2
    

    非局部的

    def outside():
        a = 1
    
        def inside_nonlocal():
            nonlocal a
            a = 2
    
        def inside():
            a = 3
    
        print(a)
        # 1
    
        inside_nonlocal()
        print(a)
        # 2
    
        inside()
        print(a)
        # 2
    
        2
  •  0
  •   dodell    8 年前

    我不清楚你的实际问题是什么。不可能做到以下几点吗?

    import backend
    
    if __name__ == "__main__":
        # parse arguments
        backend.argreceive(arguments)
    

    正如Daniel Roseman建议的那样,如果有许多后端函数需要访问这些变量,那么您应该考虑使用类和类属性来存储变量。

    class argreceive():
        def __init__(self,args):
            self.args = args