Python中的vars()提供不同的输出

时间:2012-04-23 20:28:24

标签: python string names variables

当我运行此代码时:

a = '1'
vars()['a'] = '2'
print a

我得到以下输出:

2

但是当我运行这段代码时:

def bar():
    a = '1'
    vars()['a'] = '2'
    print a

bar()

我得到以下输出:

1

现在我的问题是为什么会发生这种情况,如何让第二种情况给出与第一种情况相同的解决方案。

编辑:

无法真正找到解决方案,但我发现了一个小黑客...虽然我宁愿不使用exec:

def bar():
    a = "a"
    b = "b"
    exec a+"="+b
    print a

bar()

这让我得到了结果:

b

如果有人能找到更好的解决方案,那就太棒了。我不会以这种方式设置任何全局变量或做任何疯狂的事情,所以不要担心。

2 个答案:

答案 0 :(得分:2)

看起来新样式类会覆盖默认的__dict__行为,从而打破vars()的这种用法。不确定为什么它会影响旧式类,但它可能是相关的。

来自docs(http://docs.python.org/library/functions.html#vars):


vars([object]) 返回具有__dict__属性的模块,类,实例或任何其他对象的__dict__属性。

模块和实例等对象具有可更新的__dict__属性;但是,其他对象可能对其__dict__属性有写限制(例如,新式类使用dictproxy来阻止直接字典更新)。

没有参数,vars()就像locals()一样。请注意,locals词典仅对读取有用,因为忽略了对locals词典的更新。


您是否可以评论为什么self. = valsetattr(self, 'x', val)不能适用于您的课堂案例?

答案 1 :(得分:1)

未定义vars()结果的分配。因此,它可能在不同的场景和/或python版本和/或实现中给出不同的结果。虽然使用这种方式改变局部变量听起来可能听起来令人震惊(我尝试将它用于regex groupdict结果一次),但这非常不可移植,可能会随时中断。