Ожидается, что для каждого контейнера Python C
for item in C:
assert item in C
пройдет нормально - не вы найдете это удивительно , если один смысл in
(клаузулы цикла) имел совершенно иное значение от других (проверок присутствия)? Я уверен, что будет! Это естественно работает для списков, наборов, кортежей, ...
Итак, когда C
это словарь, если бы in
в for
цикле были получены кортежи ключ / значение , тогда, по принципу наименьшего удивления, in
он также должен был бы взять такой кортеж в качестве своего левого операнда при проверке содержания.
Насколько это было бы полезно? Довольно бесполезный действительно, в основном делает if (key, value) in C
синоним if C.get(key) == value
- что проверка Я считаю , что , возможно, выполнены, или хотел выполнить, в 100 раз реже , чем то , что на if k in C
самом деле означает , проверка наличия ключа только и полностью игнорируя значение.
С другой стороны, довольно часто возникает желание зацикливаться только на клавишах, например:
for k in thedict:
thedict[k] += 1
наличие значения тоже не поможет:
for k, v in thedict.items():
thedict[k] = v + 1
на самом деле несколько менее ясный и менее лаконичный. (Обратите внимание, что это items
было исходное написание «правильных» методов для использования для получения пар ключ / значение: к сожалению, это было еще в те дни, когда такие методы доступа возвращали целые списки, поэтому для поддержки «простого повторения» пришлось ввести альтернативное написание , и iteritems
было - в Python 3, где ограничения обратной совместимости с предыдущими версиями Python были значительно ослаблены, стало items
снова).
x in foo
только еслиi
in в какой-то моментfor i in foo
принимает значениеx
, я бы сказал, что это будет очень огромная несогласованность.