Python: packing & unpacking

6-Wrz-2017

Python ma ciekawe rozwiązanie dotyczące przepisywania wartości. Jest to szczególnie prawdziwe w przypadku, gdy za jednym zamachem chcesz przypisać kilka wartości. Instrukcja

my_tuple = (1,2,3,4)

to tzw. tuple packing – wartości 1,2,3,4 są konwertowane do tuple i zapisywane w zmiennej.

Instrukcja

(a,b,c,d) = my_tuple
print(a,b,c,d)

to tzw. tuple unpacking. Jest tworzony roboczy tuple (a,b,c,d) i do niego do każdej kolejnej wartości z tego tuple są przypisywane kolejne wartości z my_tuple, więc w efekcie a ma wartość 1, b ma wartość 2, c ma wartość 3, a d ma wartość 4

Dla ułatwienia (bo Pythonowcy lubią upraszczać sprawy) podczas wykonywania można pisać nawiasy, ale nie trzeba. Tutaj do a1, a2, a3, a4 najpierw przypisują wartości w sposób tradycyjny, a potem już wykonuję równoważne polecenia:

a1=10
a2=20
a3=30
a4=40

(b1,b2,b3,b4) = (a1,a2,a3,a4)
(b1,b2,b3,b4) = a1,a2,a3,a4
b1,b2,b3,b4 = (a1,a2,a3,a4)
b1,b2,b3,b4 = a1,a2,a3,a4

jeszcze fajniej wygląda to przy pracy z napisami:

i,j,k,l = 'Nice'
print(i,j,k,l)

Napis ‚Nice’ jest traktowany jako czteroelementowa lista, a podczas przypisania do zmiennych i, j, k, l do każdej z nich trafia tylko jedna literka z napisu.

Jeśli jednak ilość zmiennych po lewej i prawej stronie się nie zgadza, to dostaniesz błąd:

x,y,z = 1,2,3,4

ValueError: too many values to unpack (expected 3)

Żeby go poprawić trzeba tylko zadbać o taką samą ilość elementów po lewej stronie jak i po prawej stronie.

Na początku wygląda to dziwnie i może się trochę w głowie kręcić od mnóstwa możliwości, ale da się przywyknąć 🙂

Dodaj komentarz:

Autor: Rafał Kraik