Mat*_*rla 3 python dictionary python-3.x
我对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}
Run Code Online (Sandbox Code Playgroud)
在实际方面{'foo':foo, 'bar': bar}
,dict或字符串中的丑陋等.format()
工作正常.
只是我错过了一些东西,所以知道为什么会增加我的编码chi(截至目前我在编码时不发光).
因为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>}
Run Code Online (Sandbox Code Playgroud)
像你一样,分配locals()
给locale
你负责.你没有locals
在理解中打电话.
请注意,在Python 2中,情况有点模糊.dict-comps以类似的方式失败但是list-comps,它早于dict-comps,工作得很好:
>>> _ = [locals()[k] for k in ('foo', 'bar', 'baz')]
>>> _
[20, 40, 60]
Run Code Online (Sandbox Code Playgroud)
这是另一个用Py3 解决的 "疣" .
归档时间: |
|
查看次数: |
347 次 |
最近记录: |