Відповіді:
Для кожного контейнера 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
знову стало ).
Я здогадуюсь: використання повного кортежу було б більш інтуїтивно зрозумілим, але, можливо, менше для тестування на використання членства in
.
if key in counts:
counts[key] += 1
else:
counts[key] = 1
Цей код насправді не спрацював, якби вам довелося вказати і ключ, і значення для in
. Мені важко уявити випадок використання, коли ви перевірите, чи в словнику є обидва значення ключа І значення. Набагато природніше лише тестувати клавіші.
# When would you ever write a condition like this?
if (key, value) in dict:
Тепер не обов’язково, щоб in
оператор і for ... in
працював над одними і тими ж елементами. Це стосується різних операцій ( __contains__
порівняно __iter__
). Але ця маленька неузгодженість була б дещо заплутаною і, ну, непослідовною.
x in foo
лише якщоi
в певному моментіfor i in foo
припускається значенняx
, я б сказав, що це було б дуже величезною невідповідністю.