如何将locals()中的值赋给同名的本地变量?

3

这个有效:

def foo():
    locals().update({'bar': 12})
    print(locals()['bar'])  # 12

这个失败了:

def foo():
    locals().update({'bar': 12})
    bar = locals()['bar']  # KeyError: 'bar'
    print(bar)

4
你为什么要做这种事情? - bruno desthuilliers
2
为什么不直接写成 bar=12 呢? - khelwood
1
@NitheeshMN 这在代码片段中被注释为:“KeyError: 'bar'” - bruno desthuilliers
4
针对你的具体用例,最好使用普通字典而非滥用locals()函数。这种滥用方式很容易出错(我曾有过此经历),并且不利于代码的可读性、可测试性和可维护性。而且,正如你现在可能已经注意到的那样,它在很多情况下都不能按照预期工作。 - bruno desthuilliers
1
这��像是一种滥用情况,而不是一个使用案例。 (是的,我只是想开个无聊的玩笑。起诉我吧。) - Aran-Fey
显示剩余6条评论
3个回答

5

https://docs.python.org/3/library/functions.html#locals

注意:不应修改此字典的内容;更改可能不会影响解释器使用的本地和自由变量的值。

编辑:但是如上所述,bar = 12 当然可以工作:

>>> def foo():
...     bar = 12
...     bar_ = locals()["bar"]
...     print(bar_)
...     
... 
>>> foo()
12

0

更改变量名称。我的意思是:

bar = locals()['bar']  # KeyError: 'bar'

关于

tmp = locals()['bar'] # 12

-1

当您运行此代码时:

def foo():
    locals().update({'bar': 12})
    print locals()
    bar = locals()['bar']

输出结果是: 首先打印{} 然后我们遇到一个KeyError

所以,我猜测当你尝试给一个变量赋值时(bar = locals()['bar']),你的locals没有被更新。但在你的第一个例子中它能正常工作,因为你没有进行任何赋值操作。

编辑1: 我查看了你的 Github 链接,我建议你使用一个dict而不是locals。例如,

def base_config():
    return dict(num_epochs=50, bath_size=200, gradient_clipping=100.0)

1
我认为问题出在给名称 bar 赋值时,Python 将 bar 视为尚未定义的变量。我猜测这可能与 locals() 的性能优化有关,有时它是一个字典,有时则是一个数组。 - danijar
感谢您的编辑。问题在于字典不允许我根据先前的值计算某些值。我可以这样做 config = dict(); config['first_param'] = 12; config['second_param'] = 0.5 * config['first_param'],但我希望有更好的语法。 - danijar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接