Python中globals()的原因?

63 python global global-variables

在Python中使用globals()函数的原因是什么?它只返回全局变量的字典,它们已经是全局的,所以它们可以在任何地方使用......我只是出于好奇,试图学习python.

def F():
    global x
    x = 1

def G():
    print(globals()["x"]) #will return value of global 'x', which is 1

def H():
    print(x) #will also return value of global 'x', which, also, is 1

F()
G()
H()
Run Code Online (Sandbox Code Playgroud)

我真的不明白这里的意思吗?只有我需要它的时候,如果我有本地和全局变量,两者都有相同的名称

def F():
    global x
    x = 1

def G():
    x = 5
    print(x) #5
    print(globals()["x"]) #1

F()
G()
Run Code Online (Sandbox Code Playgroud)

但是你应该永远不会遇到两个具有相同名称的变量,并且需要在同一范围内使用它们的问题.

Ian*_*and 83

Python为程序员提供了大量用于内省运行环境的工具.globals()只是其中之一,它在调试会话中非常有用,可以查看全局范围实际包含的对象.

我敢肯定,它背后的基本原理与locals()用于查看函数中定义的变量,或dir用于查看模块的内容或对象的属性的原理相同.

来自C++背景,我可以理解这些东西似乎没必要.在静态链接的静态类型环境中,它们绝对是.在这种情况下,在编译时确切知道哪些变量是全局变量,对象将具有哪些成员,甚至是另一个编译单元导出的名称.

然而,在动态语言中,这些东西并不固定; 它们可以根据代码的导入方式,甚至在运行时进行更改.至少由于这个原因,在调试器中访问这类信息可能是非常宝贵的.

  • +1.此外,`globals`返回的字典可以被修改(可能是最好留给专家的能力).同样相关的是[Dive Into Python](http://www.diveintopython.net/html_processing/locals_and_globals.html)"使用`locals`和`globals`函数,您可以动态获取任意变量的值,将变量名称作为字符串提供.这反映了`getattr`函数的功能,它允许您通过将函数名称作为字符串动态地访问任意函数." (11认同)

Ale*_*oka 38

当您需要使用函数的字符串名称调用函数时,它也很有用.例如:

def foo():
    pass

function_name_as_string = 'foo'

globals()[function_name_as_string]() # foo(). 
Run Code Online (Sandbox Code Playgroud)

  • @ksooklall 你像往常一样将它传递给函数:使用 `def foo(*args): print("hw", *args)` 你可以:`globals()['foo']()` 或 `globals( )['foo']('reason', 42)` 等 (3认同)

Bry*_*ley 8

你可以传递的结果globals(),并locals()eval,execfile__import__命令.这样做会为这些命令创建受限制的环境.

因此,存在这些函数以支持其他功能,这些功能受益于被赋予可能与当前上下文不同的环境.例如,您可以globals()在调用其中一个函数之前调用然后删除或添加一些变量.


Ric*_*ose 6

globals()是有用的eval()- 如果你想评估一些引用范围内变量的代码,那些变量将是全局变量或本地变量.


为了扩展一点,eval()内置函数将解释给它的一串Python代码.签名是:eval(codeString, globals, locals),你会像这样使用它:

def foo():
    x = 2
    y = eval("x + 1", globals(), locals())
    print("y=" + y) # should be 3
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为解释器xlocals()变量的字典中获取值.您当然可以将自己的变量字典提供给eval.