Zuordnungen rekursiv definiert sind, müssen Sie use parentheses ()
and/or square brackets []
to enclose target names und die verschachtelte Struktur Ihrer iterable entsprechen. In Ihrem Fall:
a, b, c, (d, (e, f)) = v
print(a, b, c, d, e, f)
1 2 3 4 5 6
In ähnlicher Weise ohne Änderung der Semantik, könnten Sie []
verwenden, um die Struktur zu bezeichnen:
a, b, c, [d, [e, f]] = v
print(a, b, c, d, e, f)
1 2 3 4 5 6
oder, natürlich, mischen sie.
Python wird dann v
auszupacken und die ersten 3 Werte normalerweise zuzuweisen, dann den Inhalt des (d, (e, f))
auszupacken und d
zuweisen und dann wieder (e, f)
auszupacken und das gleiche tun.
können Sie dies sehen, ob Sie die dis
Modul importieren und Zerlegen der Anweisung mit dis.dis
:
dis.dis('a, b, c, (d, (e, f)) = v')
1 0 LOAD_NAME 0 (v)
3 UNPACK_SEQUENCE 4 # <- first unpack
6 STORE_NAME 1 (a)
9 STORE_NAME 2 (b)
12 STORE_NAME 3 (c)
15 UNPACK_SEQUENCE 2 # <- second unpack
18 STORE_NAME 4 (d)
21 UNPACK_SEQUENCE 2 # <- third unpack
24 STORE_NAME 5 (e)
27 STORE_NAME 6 (f)
30 LOAD_CONST 0 (None)
33 RETURN_VALUE
Im Allgemeinen auszupacken willkürlich verschachtelten Strukturen, in der linken Seite der Zuweisung der Struktur übereinstimmen (Ziel -Liste):
v = [1, [2, [3, [4, 5]]]]
[a, [b, [c, [d, e]]]] = v
print(a, b, c, d, e)
1 2 3 4 5
die äußere []
sind, natürlich nicht notwendig, so dass sie gerade hinzufügen, einfach zu zeigen, dass die Struktur passend genügt.
Sie nutzen könnten 'isinstance (i, Container)' mit 'Container' von' collections.abc', um alle Container zu fangen, nicht nur 'list' und' Tupel 'Arten. –
@JimFasarakisHilliard: Obwohl Sie "str" (und möglicherweise "bytes" und verwandte Typen) explizit explizit ausschließen oder anders angeben möchten, da sie als "Container" gelten, aber normalerweise als skalare Größen verwendet werden . – ShadowRanger