我第一次使用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'}
现在,我想知道发生了什么,因为这个函数没有很好的记录,我找不到示例如果在函数内部返回那些变量
答案 0 :(得分:2)
在模块的“全局”范围内调用它的原因是它在该上下文中等同于globals()
,它实际上是python存储的字典。非全局作用域的本地实际上并不是实现中的字典(这是为了避免在访问时查找字典键),因此没有真正的字典可以返回。相反,Python为你做了一个,但它并没有以任何方式连接到真正的局部变量数组。我知道将新的本地人插入执行框架的唯一方法是使用exec
或eval
,但几乎总有一种更好的方法可以做你想要的,而不涉及创建本地人苍蝇。
如果要在非执行帧中创建局部变量,则可以对其应用字节码变换,例如:将全局变成局部,细胞或常数,但这是一些非平凡的黑魔法,而且,几乎肯定有更好的方法。
你的问题提到了返回的东西,但我没有看到你要回来的东西。你究竟想要归还什么?
我认为你给返回值的名称应该影响很小,因为这不是它们在调用框架中给出的名称。为什么一本简单的字典不够用?
答案 1 :(得分:0)
vars()
的行为类似于locals()
,如果没有参数,则来自the docs:
注意:不应修改此词典的内容;更改可能不会影响解释器使用的本地和自由变量的值。