Oczekiwanie jest takie dla każdego kontenera Pythona C
for item in C:
assert item in C
przejdzie w porządku - nie możesz znaleźć to zadziwiające, jeśli jeden zmysł in
(klauzula pętla) miał zupełnie inne znaczenie od innych (sprawdzania obecności)? Z pewnością! To oczywiście działa w ten sposób w przypadku list, zestawów, krotek, ...
Tak więc, gdy C
jest słownikiem, gdyby in
w for
pętli uzyskać krotki klucz / wartość , to zgodnie z zasadą najmniejszego zdziwienia in
musiałby również przyjąć taką krotkę jako operand po lewej stronie podczas sprawdzania zawartości.
Jak przydatne byłoby to? Rzeczywiście całkiem bezużyteczne, po prostu tworząc if (key, value) in C
synonim if C.get(key) == value
- co jest sprawdzianem, który, jak sądzę, mogłem wykonać lub chciałem wykonać 100 razy rzadziej niż to, co w if k in C
rzeczywistości oznacza , sprawdzając obecność tylko klucza i całkowicie ignorując wartość.
Z drugiej strony chęć zapętlenia tylko na klawiszach jest dość powszechna, np .:
for k in thedict:
thedict[k] += 1
posiadanie wartości również nie pomogłoby szczególnie:
for k, v in thedict.items():
thedict[k] = v + 1
w rzeczywistości nieco mniej jasne i mniej zwięzłe. (Zauważ, że items
była to oryginalna pisownia "właściwych" metod do uzyskiwania par klucz / wartość: niestety było to w czasach, gdy takie metody dostępu zwracały całe listy, więc aby obsługiwać "tylko iterację" trzeba było wprowadzić alternatywną pisownię i iteritems
było - w Pythonie 3, gdzie ograniczenia kompatybilności wstecznej z poprzednimi wersjami Pythona zostały znacznie osłabione, stało się items
ponownie).
x in foo
tylko jeślii
w pewnym momenciefor i in foo
przyjmie wartośćx
, powiedziałbym, że byłaby to bardzo duża niespójność.