这个有效:
def foo():
locals().update({'bar': 12})
print(locals()['bar']) # 12
这个失败了:
def foo():
locals().update({'bar': 12})
bar = locals()['bar'] # KeyError: 'bar'
print(bar)
这个有效:
def foo():
locals().update({'bar': 12})
print(locals()['bar']) # 12
这个失败了:
def foo():
locals().update({'bar': 12})
bar = locals()['bar'] # KeyError: 'bar'
print(bar)
https://docs.python.org/3/library/functions.html#locals
注意:不应修改此字典的内容;更改可能不会影响解释器使用的本地和自由变量的值。
编辑:但是如上所述,bar = 12
当然可以工作:
>>> def foo():
... bar = 12
... bar_ = locals()["bar"]
... print(bar_)
...
...
>>> foo()
12
更改变量名称。我的意思是:
bar = locals()['bar'] # KeyError: 'bar'
关于
tmp = locals()['bar'] # 12
当您运行此代码时:
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)
bar
赋值时,Python 将 bar
视为尚未定义的变量。我猜测这可能与 locals()
的性能优化有关,有时它是一个字典,有时则是一个数组。 - danijarconfig = dict(); config['first_param'] = 12; config['second_param'] = 0.5 * config['first_param']
,但我希望有更好的语法。 - danijar
bar=12
呢? - khelwoodlocals()
函数。这种滥用方式很容易出错(我曾有过此经历),并且不利于代码的可读性、可测试性和可维护性。而且,正如你现在可能已经注意到的那样,它在很多情况下都不能按照预期工作。 - bruno desthuilliers