如何在范围内获得所有变量?

时间:2018-04-30 19:04:16

标签: python

如果我有以下代码:

var_global = "global"
def outer() :
    var_outer = "outer"
    def inner() :
        var_inner = "inner"
        # How to get here all variables available (it should contain
        # var_inner, var_outer, var_global)?
        print("inner", locals(), globals())
    return inner

我跑:

outer()()

我想在print位置获取所有变量。这应包括var_outer。但localsglobals都没有提供它。

3 个答案:

答案 0 :(得分:6)

仅当inner实际包含对var_outer变量的访问时,才会触发为inner提供var_outer访问权限的闭包变量机制。否则,var_outer不会被保存,并且没有内省可以让您访问它。

答案 1 :(得分:4)

var_outer确实无法在inner()中使用。在嵌套函数中使变量可用要求变量以与开始不同的方式存储;由于缺少对嵌套函数变量的任何引用,Python没有这样做。如果您确实插入了这样的引用(例如裸声明var_outer),它将显示在locals()的输出中。

答案 2 :(得分:-1)

var_outer可以通过非本地访问var_inner。

var_global = "global"
def outer():
    var_outer = "outer"
    def inner():
        var_inner = "inner"
        print("inner", locals(), globals())
        nonlocal var_outer
        print(var_outer)
    return inner

outer()()

将打印:

inner {'var_outer': 'outer', 'var_inner': 'inner'} [...]