Установить понимание не ведет себя, как ожидалось

Нужна помощь, почему этот фрагмент кода не возвращается, как я ожидал

>>> 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']

1 ответ

Решение

В Python 2 набор и словарь имеют свою область видимости; locals() внутри такой конструкции относится к этой новой вложенной области видимости.

Пониманий списков нет, потому что они были реализованы ранее в жизненном цикле языка до того, как разработчики осознали, что новая область будет гораздо лучшей идеей. В Python 3 списочные выражения тоже имеют свою область видимости.

Вы можете обойти это, создав единственную ссылку на словарь, который locals() возвращается перед запуском вашего заданного понимания:

>>> l = locals()
>>> {e for e in v if l.get(e) is None}
{'c', 'b'}
Другие вопросы по тегам