我在玩Python 3.8中的以下代码:
a = range(10)
limits = (5, 3) # order of limits doesn't matter
a = (i for i in a if i > limit[0])
a = (i for i in a if i > limit[1])
print(list(a))
如评论中所提到的,在这种情况下先应用哪个限制并不重要。无论是limits = (5, 3)
还是(3, 5)
,[6, 7, 8, 9]
两种情况下最后一行的输出都是。但是,代码(似乎)无关紧要的重构不再是这种情况:
a = range(10)
limits = (5, 3) # order of limits matters now?
for limit in limits:
a = (i for i in a if i > limit)
print(list(a))
使用重构,如果limits = (3, 5)
,则结果输出为[6, 7, 8, 9]
,但使用时limits = (5, 3)
,输出等于[4, 5, 6, 7, 8, 9]
。在这种情况下,似乎仅应用了最终过滤器;当我运行以下代码时:
a = range(10)
limits = (4, 3, 2, 1, 0)
for limit in limits:
a = (i for i in a if i > limit)
print(list(a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
是输出。有人可以解释为什么这种现象发生吗?
在重构版本中,limit
变量的值在生成器生成值时查找,而不是在生成生成器对象时查找。
由于值产生仅发生在的最后一行list(a)
,因此此时的值limit
与循环的最后一次迭代的值相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句