当我运行此代码时:
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
如果有人能找到更好的解决方案,那就太棒了。我不会以这种方式设置任何全局变量或做任何疯狂的事情,所以不要担心。
答案 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. = val
或setattr(self, 'x', val)
不能适用于您的课堂案例?
答案 1 :(得分:1)
未定义vars()
结果的分配。因此,它可能在不同的场景和/或python版本和/或实现中给出不同的结果。虽然使用这种方式改变局部变量听起来可能听起来令人震惊(我尝试将它用于regex groupdict结果一次),但这非常不可移植,可能会随时中断。