如何从函数返回本地变量([object])?

时间:2010-10-29 06:23:36

标签: python

我第一次使用vars()函数,并注意到这种行为:

nodes = ['one', 'two', 'three']

for node in nodes:
    vars()[node + '_'] = 'some calc ' + node
    vars()[node] = vars()[node + '_']

print one

使用此片段,Python会按预期输出some calc one,但如果我在这样的函数中使用它:

def main():

    nodes = ['one', 'two', 'three']

    for node in nodes:
        vars()[node + '_'] = 'some calc ' + node
        vars()[node] = vars()[node + '_']

    print one

main()

输出NameError: global name 'one' is not defined

vars()对象是dict:

{'node': 'three', 'three_': 'some calc three', 'two': 'some calc two', 'one': 'some calc one', 'two_': 'some calc two', 'three': 'some calc three', 'nodes': ['one', 'two', 'three'], 'one_': 'some calc one'}

现在,我想知道发生了什么,因为这个函数没有很好的记录,我找不到示例如果在函数内部返回那些变量

2 个答案:

答案 0 :(得分:2)

在模块的“全局”范围内调用它的原因是它在该上下文中等同于globals(),它实际上是python存储的字典。非全局作用域的本地实际上并不是实现中的字典(这是为了避免在访问时查找字典键),因此没有真正的字典可以返回。相反,Python为你做了一个,但它并没有以任何方式连接到真正的局部变量数组。我知道将新的本地人插入执行框架的唯一方法是使用execeval,但几乎总有一种更好的方法可以做你想要的,而不涉及创建本地人苍蝇。

如果要在非执行帧中创建局部变量,则可以对其应用字节码变换,例如:将全局变成局部,细胞或常数,但这是一些非平凡的黑魔法,而且,几乎肯定有更好的方法。

你的问题提到了返回的东西,但我没有看到你要回来的东西。你究竟想要归还什么?

我认为你给返回值的名称应该影响很小,因为这不是它们在调用框架中给出的名称。为什么一本简单的字典不够用?

答案 1 :(得分:0)

vars()的行为类似于locals(),如果没有参数,则来自the docs

  

注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。