【问题标题】:vars() in Python giving different outputPython 中的 vars() 给出不同的输出
【发布时间】:2012-04-23 20:28:23
【问题描述】:

当我运行这段代码时:

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

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

【问题讨论】:

  • 我相信课程没有区别 - 这是本地与全球范围的问题。
  • 另外,如果您尝试在函数中以这种方式设置全局变量,您可能会做错事。

标签: python string names variables


【解决方案1】:

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

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


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

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

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


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

【讨论】:

  • 这部分文档似乎是关键:“注意,本地字典仅对读取有用,因为本地字典的更新被忽略。”即,您不应该修改 vars() 返回的任何内容。
  • 我认为这与课程没有任何关系,因为我可以删除课程部分并且仍然有同样的问题。我相信问题出在功能上。我试过自我。 = val 和 setattr(self, 'x', val) 但仍然得到相同的结果。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2020-08-17
    • 2021-04-13
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多