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

nls*_*bch 2 python scope global-variables variable-declaration

根据这个问题的接受答案,我理解我无法创建纯全局变量.好的,很酷.

然而,他继续说:

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

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

显然,在我通过命令行参数访问传递给我的python程序的变量的努力中,我显然缺少一些关键的东西.

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

backend具有依赖于通过命令行参数输入的代码.但是,我似乎无法提供这些参数backend.

我的包的布局是:

mypackage
- __main__.py
- backend/
    -__init__.py
    -direction.py
Run Code Online (Sandbox Code Playgroud)

这是__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
Run Code Online (Sandbox Code Playgroud)

我的backend/direction.py:

global target_dir
print(target_dir)
Run Code Online (Sandbox Code Playgroud)

运行这个提出了一个NameError: 'target_dir' is not defined.那么大便呢?我在这里假设是不可能的,还是我只是搞砸了声明?

Bre*_*bel 6

global只有它使用的模块内的工作,也不要使用global声明在全球范围内(即该模块范围内)的全局变量.您可以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
Run Code Online (Sandbox Code Playgroud)

外地

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
Run Code Online (Sandbox Code Playgroud)