根据list comprehension doc和this question:squares = [x**2 for x in range(10)]
相当于squares = list(map(lambda x: x**2, range(10)))
但是Python真的通过map
和lambda
实现了列表理解吗?或者文档中的squares = list(map(lambda x: x**2, range(10)))
只是近似值,而不是完全等价?
-
如果是这样,如何处理迭代
enumerate
个对象?例如,squares = [(idx, x**2) for idx, x in enumerate(range(10))]
?我发现很难模仿前面的例子,并用map
和lambda
重写它. -
如果不是(我倾向于这个选项,但不确定),列表理解是单独实现的吗?有什么python句子完全等同于列表理解吗?
我的研究成果:
我try 了squares = [print(locals()) for x in range(1)]
对squares = list(map(lambda x: print(locals()), range(1)))
,在这个问题eval fails in list comprehension中.第一个得到{'.0': <range_iterator object at 0x000002AB976C4430>, 'x': 0}
,而后者得到{'x': 0}
.也许这表明它们并不完全等价.
我还发现了以下问题:
- Where are list comprehensions implemented in CPython source code?
- How does List Comprehension exactly work in Python?
- List comprehension vs map
他们正在使用Python汇编来显示列表理解的行为.这些答案可能表明列表理解是单独实现的.
所以我倾向于相信map
和lambda
不能实现列表理解.然而,我不确定,我想知道"是否有任何python句子完全等同于列表理解",正如我上面提到的.
这个问题的由来:
我正在努力达到answer a question.我想解释与列表理解相关的奇怪行为,而不使用python汇编.我过go 认为列表理解是通过my previous answer中的lambda
实现的.然而,我现在对此表示怀疑.