Instrukcja przypisania jest wykorzystywana do przypisywania obiektów do nazw, czyli zmiennych. Cel przypisania umieszczamy po lewej stronie i jest to nasza zmienna, natomiast obiekt jest umieszczany po prawej i może być to obiekt lub wyrażenie obliczające obiekt. Cel znajdujący się po lewej stronie może być po prostu nazwą lub częścią jakiegoś innego obiektu, na przykład atrybutem.
Najważniejsze informacje na temat instrukcji przypisania w Pythonie:
- Przypisania tworzą referencje do obiektu, a nie ich kopie. O zmiennych należy myśleć jako o wskaźnikach do danych znajdujących się w pamięci.
- Zanim odwołamy się do zmiennej, musimy najpierw ją przypisać. Jeśli zapomnimy o tym, Python zgłosi wyjątek.
- Zmienne tworzy się podczas pierwszego przypisania, dlatego nie trzeba ich wcześniej deklarować. Zmienna wykorzystywana w wyrażeniu jest zastępowana wartością, do której się odnosi.
- Istnieją również przypisania niejawne, takie jak importowanie modułów, tworzenie funkcji i klas, a także tworzenie tymczasowych zmiennych w pętli for.
Przypisanie może odbywać się na różne sposoby, poniżej opisujemy różne jego formy.

Różne formy przypisania w Pythonie
>>> my_str = 'Python'
Przypisanie pozycyjne poprzez krotkę:
>>> my_str, my_secstr = 'Python', 'snake'
Przypisanie pozycyjne poprzez listę:
>>> [my_str, my_secstr] = ['Python', 'snake']
Ogólne przypisanie sekwencji:
>>> a, b, c, d, e, f = 'Python'
Przypisanie poprzez rozpakowania sekwencji:
>>> a, b, *c = 'Python'
Przypisanie do kilku celów:
>>> my_str = my_secstr = 'Python'
Przypisanie rozszerzone:
>>> my_str += '3.9'
Przypisanie rozpakowujące kropki i listy
Przypisując obiekty w ten sposób łączymy nazwy z lewej strony z obiektami z prawej strony w pary zgodnie z ich pozycją. Takie przypisanie dokonuje niejawnej iteracji po elementach sekwencji.
Przypisanie sekwencji
Jest to opcja dostępna w nowszych wersjach Pythona, który przypisuje dowolną sekwencję nazw do dowolnej sekwencji wartości po jednym elemencie na każdą nazwę zgodnie z pozycją. Należy pamiętać o tym, że liczba nazw musi odpowiadać liczbie elementów w sekwencji. Przykład:
>>> a, b, c, d, e, f = 'Python'
Przypisanie poprzez rozpakowanie sekwencji
Od wersji 3.x Pythona możliwe jest przypisywanie przy użyciu sekwencji, nawet jeśli liczba elementów po prawej stronie nie odpowiada liczbie elementów po lewej stronie. Nadmiarowe elementy zostaną wówczas przypisane do obiektu z gwiazdką. Dzięki temu nie trzeba stosować wycinków w przypisaniu.
>>> a, *b = "Python"
>>> b
['y', 't', 'h', 'o', 'n']
>>> a
'P'
Przypisanie do kilku celów
Jest to forma przypisania, w której Python do wszystkich nazw znajdujących się po lewej przypisuje ten sam obiekt znajdujący się po prawej.
>>> my_str = my_secstr = 'Python'
Przypisanie rozszerzone
Pozwala na połączenie wyrażenia i przypisania. Jest to szczególnie korzystne w przypadku obiektów mutowalnych, ponieważ dodawanie pozwala na modyfikację obiektów w miejscu zamiast jego kopiowania.
>>> my_str += '3.9'
Przypisanie sekwencji jako sposób na szybką zamianę wartości
Możliwość przypisania sekwencji do zmiennych będących sekwencjami pozwala na stworzenie kodu, który umożliwia szybką zamianę wartości poszczególnych zmiennych.
>>> first_a = 'a'
>>> first_b = 'b'
>>> first_a, first_b = first_b, first_a
>>> first_a
'b'
>>> first_b
'a'
Możliwe jest mieszanie sekwencji różnego typu:
>>> (a, b, c) = ['A', 'b', (0, 4)]
>>> a
'A'
>>> c
(0, 4)
Tak naprawdę po prawej stronie można umieścić dowolny obiekt iterowalny, nie tylko sekwencję , dlatego w tego typu przypisaniach można zastosować nawet kolejne wiersze pliku.
Przepisywanie sekwencji poprzez wycinki
Zastosowanie wycinków pozwala na stworzenie zaawansowanego sposobu na to, aby móc przypisywać sekwencje do obiektu, nawet jeśli liczba zmiennych nie odpowiada liczbie elementów w sekwencji:
>>> mystr = 'Python'
>>> a, b, c = mystr[0:2], mystr[2:4], mystr[4:]
>>> a
'Py'
>>> b
'th'
Możemy przepisywać również sekwencje zagnieżdżone:
>>> (a, b), c = ('Py', 'thon')
>>> a
'P'
>>> c
'thon'
Z tego rodzaju przypisania korzysta się szczególnie często w pętli for, gdyż pozwala to na przypisanie zmiennych do poszczególnych elementów w określonej kolejności:
>>> for (a, b, c) in [(1, 2, 3), (4, 5, 6)]:
... print(a, b, c)
...
1 2 3
4 5 6
Przypisywanie za pomocą krotek jest stosowane również w pętlach po to, aby podzielić sekwencję na jej początkową i pozostałą część:
>>> L = [1, 2, 3]
>>> for x in L:
... first, L = L[0], L[1:]
... print(first, L)
...
1 [2, 3]
2 [3]
3 []
Przypisanie poprzez rozpakowanie sekwencji przy użyciu gwiazdki
Standardowa instrukcja przypisania przy wykorzystaniu sekwencji wymaga takiej samej liczby elementów po lewej i po prawej stronie. Jednak dzięki wykorzystaniu nazwy z gwiazdką możemy obejść to wymaganie – do zmiennej oznaczonej gwiazdką zostaną wówczas przypisane wszystkie nieprzypisane elementy.
Porównaj:
>>> L = [1, 2, 3]
>>> a, b = L
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
#użycie zmiennej z gwiazdką
>>> a, *b = L
>>> a
1
>>> b
[2, 3]
Dzięki użyciu nazwy z gwiazdką liczba zmiennych po lewej stronie nie musi się zgadzać z liczbą elementów sekwencji i po prawej. Nazwa z gwiazdką wcale nie musi znajdować się na końcu sekwencji, może wystąpić w dowolnym miejscu, w zależności od zamysłu programisty.
>>> *a, b, c = [1, 2, 3], (9, 0), 8
>>> a
[[1, 2, 3]]
>>> b
(9, 0)
Jeśli zmienna z gwiazdką pojawi się w środku, zostaną przepisane jej wszystkie elementy, które nie zostały przypisane do pozostałych zmiennych, w tym przypadku pierwszej i ostatniej.
>>> a, *b, c = [1, 2, 3, 4]
>>> b
[2, 3]
Rozszerzona składnia rozpakowania sekwencji działa nie tylko z listami czy krotkami, ale również łańcuchami znaków.
>>> a, *b = "Python"
>>> b
['y', 't', 'h', 'o', 'n']
>>> a
'P'
Należy pamiętać o tym, że przepisanie rozpakowująca sekwencję zawsze zwraca listę! Dlatego nawet przy przypisaniu pojedynczego elementu do zmiany z gwiazdką otrzymamy listę:
>>> a, b, *c = [1, 2, 3]
>>> c
[3]
Tego typu rozpakowania możemy użyć do tworzenia podobnego kodu, co w poprzednim przykładzie, gdzie powoli opróżniamy zawartość listy.
>>> L = [1, 2, 3, 4]
>>> while L:
>>> front, *L = L
>>> print(front, L)
>>> 1 [2, 3, 4]
>>> 2 [3, 4]
>>> 3 [4]
>>> 4 []
Jeśli natomiast zmiennej z gwiazdką nie przypadnie żaden element, ponieważ wszystkie zostaną zajęte przez standardowe zmienne, to otrzyma ona pustą listę. Można zatem powiedzieć, że Python priorytetyzuje przypisanie wartości do standardowych zmiennych.
>>> a, b, *c, d = [1, 2, 3]
>>> c
[]
Zmienna z gwiazdką nie może również występować pojedynczo, musi zawsze znajdować się w krotce.
>>> *a, = [1, 2] #krotka!
>>> a
[1, 2]
Przepisanie rozpakowujące sekwencję w pętli for
Tego typu przypisanie jest często wykorzystywane w pętli for w celu przepisania zmiennym kolejnych wartości z sekwencji:
>>> seq = ([1, 2, 3, 4], [5, 6, 7, 8])
>>> for a, *b, c in seq:
>>> ... print(a, b, c)
1 [2, 3] 4
5 [6, 7] 8
We wcześniejszych wersjach Pythona, czyli 2.x, gdzie tego typu składnia nie jest dostępna, należy w tym celu zastosować wycinki:
>>> for el in seq:
>>> ... a, b, c = el[0], el[1:3], el[3]
>>> ... print(a, b, c)
1 [2, 3] 4
5 [6, 7] 8
Przypisanie z wieloma celami
Składnia typu:
>>> a = b = 'Python'
>>> a
'Python'
>>> b
'Python'
Jest po prostu krótszą wersją zapisu:
>>> a = "Python"
>>> a = b
>>> a
'Python'
>>> b
'Python'
Ten rodzaj przypisania nie nastręcza wielu problemów. Mogą się one jednak pojawić wtedy, gdy celem jest obiekt mutowalny. Musimy wtedy pamiętać o tym, że zmiana w jakiejkolwiek ze zmiennych współdzielących tego typu referencję wpływa na wszystkie z nich.
>>> a = b = [1, 2, 3]
>>> b.append(4)
>>> a
[1, 2, 3, 4]
Przypisania rozszerzone
Mianem przypisania rozszerzonego określa się połączenie instrukcji i przypisania wraz z wykonaniem jakiegoś działania na wartości. Najczęściej wykorzystywane przypisania rozszerzone to działania matematyczne wraz z wyrażeniem and i or.
Dlaczego warto stosować przepisania rozszerzone?
- Po pierwsze wymagają mniej kodu do napisania.
- Po drugie są zazwyczaj szybsze, jako że lewa strona musi być obliczona tylko raz. Przykładowo, w wyrażeniu 'a = a + b’ zmienna a, jeśli stanowi jakikolwiek wyrażenie, musi być obliczona dwa razy. Stosując skróconą wersję 'a += b’ obliczenia są przeprowadzane tylko raz.
- Po trzecie tego typu przepisanie jest na tyle zoptymalizowane, że w przypadku obiektu mutowalnych samo wybiera najlepszą, najszybszą operacją modyfikującą. Przykładowo, chcąc dodać do listy element za pomocą przypisania rozszerzonego, tak naprawdę nie wykonujemy dodawania, ale wywołujemy metodę extend().
Stosując z kolei standardowe dodawanie zawsze tworzymy nowy obiekt. Może być to rozwiązanie optymalne dla osób, które nie chcą stosować referencji współdzielonych dla obiektów mutowalnych.
Porównaj, jak zachowuje się standardowe dodwanie, a jak przypisanie rozszerzone:
>>> L = [1, 2]
>>> L2 = L
>>> L = L + [3]
>>> L, L2
([1, 2, 3], [1, 2])
Powyżej: utworzenie nowego obiektu.
>>> L = [1, 2]
>>> L2 = L
>>> L += [3]
>>> L, L2
([1, 2, 3], [1, 2, 3])
Przypisanie rozszerzone modyfikuje obiekt w miejscu, ponieważ działa w zasadzie jak extend().
Nazwy zmiennych konwencja ich tworzenia
Nazwy zmiennych w Pythonie podlegają określonym regułom:
- Nazwy zmiennych muszą zaczynać się od znaku podkreślenia lub litery. następnie następuje dowolna liczba cyfr, liter lub znaków podkreślenia.
- Wielkość liter ma znaczenie, dlatego x oraz X to dwie różne zmienne,
- Jako nazwy zmiennych nie należy stosować słów zarezerwowanych, do których należy między innymi False, True, and, break, def, from, not, with, itd. Słowa zarezerwowane różnią się w zależności od wersji Pythona. Słów zarezerwowanych w najnowszej wersji jest około 30, a za każdym razem, gdy będziemy chcieli utworzyć zmienną taką samą jak słowo zarezerwowane, Python zwróci błąd:
>>> True = 0
File "<stdin>", line 1
True = 0
^
SyntaxError: cannot assign to True
>>> import = 89
File "<stdin>", line 1
import = 89
^
SyntaxError: invalid syntax
Należy pamiętać o tym, że słowa zarezerwowane to nie zmienne wbudowane, które użytkownik może z kolei samodzielnie definiować. Ponadto, jako że nazwy modułów z instrukcji import również stają się zmiennymi w skrypcie, to nie należy:
- tworzyć modułów, których nazwy nie przestrzegają konwencji tworzenia nazwy w Pythonie
- tworzyć modułów o nazwie takiej samej jak którekolwiek ze słów rezerwowanych
- tworzyć zmiennych o takiej samej nazwie, co moduły zaimportowane w danym skrypcie.
Inne zasady dotyczące nazewnictwa w Pythonie
Oprócz wspomnianych wcześniej konwencji dotyczących tego, jak tworzyć nazwy zmiennych w Pythonie, istnieje również zestaw reguł dotyczących tworzenia zmiennych o określonym charakterze. O czym w szczególności należy pamiętać?
- Zmienne zaczynające się od jednego znaku podkreślenia i kończące się również jednym znakiem podkreślenia mają specjalne znaczenie dla interpretera, dlatego należy unikać korzystania z tego wzorca w tworzeniu własnych nazw zmiennych, np. _zmienna_
- Nazwy zaczynające i kończące się przy użyciu dwóch znaków podkreślenia jak na przykład __zmienna__ również mają specjalne znaczenie dla interpretera, jako że są nazwami zdefiniowanymi przez system,
- Nazwy zaczynające się od dwóch znaków podkreślenia, ale nie kończąca się takimi dwoma znakami są lokalne dla zawierających je klas,
- Nazwy w postaci pojedynczego znaku podkreślenia przechowują wynik ostatniego wyrażenia.
To by było na tyle 😉 W następnym wpisie zapoznamy się funkcją print i dowiemy, jak bardzo zmienił się jej charakter pomiędzy wersją Pythona 2.0 i 3.0.
Dodaj komentarz
Musisz się zalogować, aby móc dodać komentarz.