我对 Python 的奇怪行为感到困惑locals()
.
基本上我想从字典中获取一个项目locals()
在字典理解中,但它失败了。这是一个非常基本的事情,所以:
>>> foo=123
>>> bar=345
>>> baz=678
>>> {k: locals()[k] for k in ('foo','bar','baz')}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
KeyError: 'foo'
>>> locals()['foo']
123
>>> locale=locals()
>>> {k: locale[k] for k in ('foo','bar','baz')}
{'foo': 123, 'bar': 345, 'baz': 678}
>>> type(locals())
<class 'dict'>
>>> def fun():
... return {'foo': 123,'bar':345}
...
>>> {k: fun()[k] for k in ('foo','bar')}
{'foo': 123, 'bar': 345}
从实用的角度来看,更丑陋{'foo':foo, 'bar': bar}
等在字典或字符串中.format()
工作正常。
只是我错过了一些东西,所以知道为什么会增加我的编码气(到目前为止,我在编码时不会发光)。
因为 Python 3 中的所有推导式都是使用隐藏函数实现的,所以调用locals
不返回您期望它返回的值。
您可以通过打印值来查看这一点:
>>> _ = {k: print(locals()) for k in ('foo','bar','baz')}
{'k': 'foo', '.0': <tuple_iterator object at 0x7fdf840afa90>}
{'k': 'bar', '.0': <tuple_iterator object at 0x7fdf840afa90>}
{'k': 'baz', '.0': <tuple_iterator object at 0x7fdf840afa90>}
分配locals()
to locale
,就像你一样,负责处理这个问题。你没有打电话locals
领悟内。
请注意,在 Python 2 中,情况有点模糊。 dict-comps 确实以类似的方式失败,但早于 dict-comps 的 list-comps 工作得很好:
>>> _ = [locals()[k] for k in ('foo', 'bar', 'baz')]
>>> _
[20, 40, 60]
这是另一个“疣”已解决 https://docs.python.org/3.0/whatsnew/3.0.html#changed-syntax与Py3。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)