通过Python中的global关键字从外部作用域访问变量

时间:2016-06-10 08:43:41

标签: python scope global-variables variable-declaration

根据这个Question's accepted answer,我知道我无法创建纯全局变量。好的,很酷。

然而,他接着说:

  

[..]你所能做的就是在特定范围内制作一个变量。 (如果在Python解释器中创建变量,然后导入其他模块,则您的变量位于最外层范围内,因此在Python会话中是全局的。[..]

好的,所以我们不能在原始意义上分配全局变量,但似乎可以通过global关键字在包中的最外层范围内访问变量,对吗?

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

我的程序有通常的__main__.py,它处理参数解析并从我的python模块backend执行代码。

backend的代码依赖于命令行参数的输入。但是,我似乎无法将这些参数提供给backend

我的包的布局是:

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

这是__main__.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 个答案:

答案 0 :(得分:6)

global仅适用于其使用的模块。您也不使用global 在全局范围内声明全局变量(即模块范围) )。您可以在函数范围内使用global来指示您要在全局范围内而不是在本地范围内使用变量。

在python 3中,还有nonlocal关键字,允许您指示要修改外部范围中不是全局/模块范围的变量。< / p>

<强>全球

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

答案 1 :(得分:0)

我不清楚你的问题究竟是什么。是不是可以这样做?

import backend

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

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

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