【发布时间】:2017-01-25 21:44:54
【问题描述】:
问题:当 Python 看到这种表达方式时,它会在后台做什么?
sum(sum(i) for j in arr for i in j)
我的想法:上面的表达方式有效。但正如Python's docs所写:
生成器表达式使用函数作用域实现
不要冗长:) 我有一个具有以下布局的数组(作为示例):
>>> arr = [
[[1,2,3], [4,5,6]],
[[7,8,9],[10,11,12]]
]
首先,我尝试将arr 的所有元素与以下表达式相加:
>>> sum(sum(i) for i in j for j in arr)
NameError: name 'j' is not defined
它引发NameError,但如果使用函数范围实现,为什么不UnboundLocalError: local variable 'j' referenced before assignment,for ... in ... 从左到右或从右到左的评估规则是什么?这个生成器表达式的等效生成器函数是什么?
编辑:
我明白了。感谢@vaultah 提供一些见解。在这种情况下,j 是发送到生成器表达式的参数:
>>> sum(sum(i) for i in j for j in arr) # NameError
这就是为什么我得到这个奇怪的NameError。
@Eric answer 显示生成器表达式:
>>> sum(sum(i) for j in arr for i in j)
相当于:
>>> def __gen(arr):
for j in arr:
for i in j:
yield sum(i)
>>> sum(__gen(arr))
【问题讨论】:
-
你的问题是关于“为什么我得到这个错误而不是另一个错误”?看来你想完成类似
sum(item for grid in arr for row in grid for item in row)的事情。但我认为这不是你真正要问的。 -
您似乎在这里有一大堆不同的问题 - 您问题顶部的列表理解与其他地方的不同 - 这是故意的吗?
-
@TadhgMcDonald-Jensen 是的,我喜欢你的解决方案!!!
-
@Eric 关于生成器表达式只有一个问题:
sum(sum(i) for j in arr for i in j)它是如何工作的?在我的想法中,我只是试图解释,我做了哪些步骤来获得正确的答案,所以我意识到我不明白发生了什么。我也喜欢your answer,不知道为什么它被否决!
标签: python python-3.x scope nested generator