3

当我运行此代码时:

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

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

4

2 回答 2

2

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

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


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

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

如果没有参数,vars() 的行为就像 locals()。请注意,本地字典仅对读取有用,因为本地字典的更新被忽略。


您能否评论一下为什么self. = valsetattr(self, 'x', val)不适用于您的班级案例?

于 2012-04-23T20:32:50.807 回答
1

vars()未定义对结果的赋值。因此,它可能会在不同的场景和/或 python 版本和/或实现中给出不同的结果。尽管能够使用这种方式更改局部变量听起来可能令人震惊(我曾尝试将它用于正则表达式 groupdict 结果),但这是高度不可移植的,并且可能随时中断。

于 2012-04-23T23:41:43.353 回答