【发布时间】:2019-06-12 05:24:20
【问题描述】:
我正在运行一段代码,该代码意外地在程序的某个部分出现逻辑错误。在调查该部分时,我创建了一个测试文件来测试正在运行的语句集,并发现了一个看起来很奇怪的异常错误。
我测试了这个简单的代码:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original to something else
print(list(f)) # Outputs filtered
输出是:
>>> []
是的,没什么。我期待过滤器理解能够获取数组中计数为 2 的项目并输出它,但我没有得到:
# Expected output
>>> [2, 2]
当我注释掉第三行再次测试时:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
### array = [5, 6, 1, 2, 9] # Ignore line
print(list(f)) # Outputs filtered
输出是正确的(你可以自己测试一下):
>>> [2, 2]
有一次我输出了变量f的类型:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original
print(type(f))
print(list(f)) # Outputs filtered
我得到了:
>>> <class 'generator'>
>>> []
为什么在 Python 中更新列表会改变另一个生成器变量的输出?这对我来说似乎很奇怪。
【问题讨论】:
-
你重新定义
array并且你的 new array 是 lazy 生成器理解所引用的。 -
很高兴看到一个提到范围的答案。
-
这是python 闭包的“后期绑定”问题的变体。生成器在这里基本上就像一个闭包。 (我不确定为什么答案如此关注懒惰……我认为,对于任何使用生成器的人来说,这都是显而易见的。)
标签: python generator variable-assignment generator-expression