设置理解没有按预期表现

set comprehension not behaving as expected

需要帮助了解为什么此代码段没有 return 我预期的那样

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

我预计它会 return set(['c', 'b']),就像我构建列表一样

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

在Python2中,set和dictionary comprehension有自己的范围; locals() 在这样的构造中指的是新的嵌套范围。

列表理解没有,因为它们是在开发人员意识到新作用域是一个更好的主意之前的语言生命周期的早期实现的。在 Python 3 中,列表理解也有自己的作用域。

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

>>> l = locals()
>>> {e for e in v if l.get(e) is None}
{'c', 'b'}