3

需要帮助了解为什么此代码段未按预期返回

>>> a = 1
>>> v = ["a", "b", "c"]
>>> {e for e in v if locals().get(e) is None}
set(['a', 'c', 'b'])

我希望它会返回set(['c', 'b']),就像我建立一个列表一样

>>> [e for e in v if locals().get(e) is None]
['b', 'c']
4

1 回答 1

6

在 Python 2 中,集合和字典推导有自己的范围;locals()在这样的构造内部指的是新的嵌套范围。

列表推导不这样做,因为它们是在开发人员意识到新范围会是一个更好的主意之前在语言生命周期的早期实现的。在 Python 3 中,列表推导也有自己的范围。

您可以通过在运行集合理解之前locals()创建对返回的字典的单个引用来解决此问题:

>>> l = locals()
>>> {e for e in v if l.get(e) is None}
{'c', 'b'}
于 2018-05-23T14:56:42.620 回答