在Python中,是否可以从函数内访问全局命名空间

Bri*_*HVB 6 python python-3.x

我正在学习Python与其他语言的良好背景.我的问题主要是学术问题,因为我知道我所要求的内容很少需要,绝对不是一个好的编程实践.

这是我要问的:

x = 'global scope'      # global
def func():
    x = 'local scope'   # global x is now shadowed
    print(global x)     # is this somehow possible?
Run Code Online (Sandbox Code Playgroud)

尝试#1

def attempt1():
    x = 'local scope'   # shadowded
    global x
    print(x)            # error
Run Code Online (Sandbox Code Playgroud)

这会导致错误:在全局声明之前将名称"x"分配给它.

尝试#2

def attempt2():
    x = 'local scope'   # shadowded
    print(__main__.x)   # error: __main__ not defined
Run Code Online (Sandbox Code Playgroud)

名称空间状态的Python文档表明#2(或类似的东西)应该是可能的.请参阅Python教程9.2

"从脚本文件中读取或交互式地从顶层调用解释器执行的语句被认为是名为__main__的模块的一部分,因此它们具有自己的全局命名空间."

但是,尝试__main__从脚本或控制台访问会导致错误.此外,global属性__name__指的是最外面的模块__builtins__,但是它只包含内置变量,而不包含任何用户定义的全局变量.如果变量是在外部模块中进行的,那么已导入的模块可以使用__module_name__.variable.

Max*_*axU 7

尝试globals():

x = 'global scope'      # global
def func():
    x = 'local scope'   # global x is now shadowed
    print(globals()['x'])     # is this somehow possible?


func()
Run Code Online (Sandbox Code Playgroud)


zon*_*ndo 5

globals()返回当前全局变量的字典。您可以打印globals()['x']


Bre*_*arn 5

你可以用globals()['x'].但是,最好只给局部变量一个不同的名称,这样你就可以global x做任何你需要做的全局变量.