Poznaliśmy już typy wartości (str, int, float, bool) oraz operacje na nich. Ale zamiast pisać `"Witaj " + "Michał"`, łatwiej jest zapamiętać imię gracza, by witać go w całej grze!
= i wpisując obok wartość.
Aby włożyć coś do pudełka, po prostu używamy znaku równości.
= ma niewiele wspólnego z operatorem porównania ==.
== zadaje pytanie "czy są równe?" (Prawda/Fałsz).= to rozkaz "Od teraz ty jesteś tym!" (Przypisanie).Wywoływanie pudełka a wpisywanie surowego tekstu to dwie różne rzeczy, na które musimy uważać.
imie = Marcin, Python spróbuje znaleźć w systemie INNE pudełko o nazwie "Marcin". Jeśli go nie ma, program wyrzuci błąd: NameError: name 'Marcin' is not defined.
Na zmiennych można wykonywać te same operacje, co na surowych danych. Komputer w locie otwiera pudełka i podmienia je w głowie na ukryte w nich wartości.
Możemy oczywiście łączyć zmienną ze zwykłą wartością prosto w print, np: print(a + "Borys"), co da nam "Hello Borys".
Zmienne potrafią się ZMIENIAĆ w trakcie trwania programu. Nowa wartość wypiera starą.
punkty = 10, a pięć linijek niżej wrzucić tam tekst: punkty = "Koniec gry" i Python nie zgłosi błędu (choć inni programiści na widok takiego misz-maszu byliby wściekli!).
Często nie chcemy nadpisywać całego pudełka nową liczbą, ale ZMODYFIKOWAĆ stary stan (np. przy leczeniu bohatera, chcemy DODAĆ mu 10hp do tego, co ma teraz).
Ciągłe pisanie x = x + 1 bywa nużące. Stworzono do tego wygodne skróty. Nazywamy to "cukrem syntaktycznym" - słodzi życie koderom!
Działa to także dla mnożenia (*=), dzielenia (/=) oraz modulo (%=). Są to niezwykle popularne operatory w pętlach i grach!
Przeanalizuj poniższy kod w głowie (linijka po linijce). Jaka będzie ostateczna wartość w zmiennej score, która zostanie wydrukowana na samym końcu?
Linia 1 i 2:
Pudełko score to 0, pudełko mnożnika to 10.
Linia 3: score += points_per_coin * 3
Wykonujemy mnożenie 10 * 3 = 30. Następnie += wsypuje tę wartość do score. Zmienna score wynosi teraz 30.
Linia 4: score -= 5
Z 30 zabieramy 5. Ostateczna wartość w pudełku to 25.
Nie możemy nazywać naszych pudełek jak nam się podoba. Python posiada sztywne reguły, które wyłapią błędy.
moja zmienna = 5 to błąd Syntax).1_zmienna to błąd).Skoro nie możemy w zmiennych używać spacji, w jaki sposób oddzielić od siebie słowa, żeby nazwa szybkoscracingcara była czytelniejsza dla oka?
W Pythonie oficjalnie przyjętym standardem jest snake_case ("pisownia wężowa").
Wszystkie litery są w niej MAŁE, a zamiast spacji wstawiamy znak podkreślenia `_`.
szybkoscRacingCara = 200. W Pythonie pełzamy snake_casem!
Które z poniższych nazw zmiennych są błędne (wywołają krytyczny błąd w kodzie), a które po prostu są brzydkie i łamią niepisaną zasadę snake_case?
Zastanów się zanim przewiniesz dalej!
Python oferuje małe skróty, jeśli chcesz szybko stworzyć dużo zmiennych na start gry (np. resetowanie wyniku dla wszystkich 3 graczy do zera).
Kierunek działania przypisania: od najbardziej z prawej strony do lewej. Komputer najpierw widzi 0 i wrzuca do `c`, potem zawartość `c` wrzuca do `b`, potem zawartość `b` do `a`.
Jeśli masz więcej wartości do przypisania o różnym typie, możesz wypisać je po przecinku z lewej, a potem podać tyle samo odpowiedzi po prawej stronie! Nazywa się to wielokrotnym przypisaniem.
Składnia po przecinku ma genialne zastosowanie w przypadku chęci ZAMIANY wartości miejscami (swap).
Czasem chcemy stworzyć etykietę i przygotować w pamięci RAM pudełko (np. stworzyć bohatera, który ma w statystykach imie), ale jeszcze na starcie gry... nie znamy jego nazwy (czeka na uzupełnienie).
Aby sprawdzić czy nasze pudełko nadal zieje pustką (bo np. gracz go nie uzupełnił w oknie logowania), nie powinno używać się standardowego operatora równości ==.
Zmienne zajmują miejsce w RAM (nawet bardzo mało). Czasem chcemy się pozbyć wartości całkowicie, niszcząc ją bezpowrotnie (tzw. zbiórka śmieci przez komputer).
Aby to zrobić, po prostu wrzucamy nową pustkę z powrotem do starego pudełka.
Ciekawostka: w Pythonie działa tzw. Garbage Collector (Śmieciarka). Jeśli do Twojej wartości ("PoufneDane") nie ma już podpiętej ŻADNEJ zmiennej ani strzałki... Śmieciarka Pythona zauważy to, i wymaże ją z istnienia na komputerze całkowicie za Ciebie.
Oto zestaw najpotężniejszych trików dotyczących zmiennych, które opanowaliśmy dzisiaj:
| Koncepcja | Przykład (Python) | Co robi? |
|---|---|---|
| Operatory Skrócone | hp -= 20 | Zmniejsza obecną wartość o podaną z prawej strony i nadpisuje stan. |
| Przypisanie Wielokrotne | a = b = c = 0 | Ustawia wszystkim zmiennym jedną i tę samą początkową wartość. |
| Rozpakowywanie & Swap | a, b = b, a | Zamienia zmienne błyskawicznie miejscami (np. w sortowaniu). |
| Brak Danych | None | Wartość uroczyście oznaczająca "Pustkę". Testowana operatorem "is None". |
Część I za nami! Został nam potężny temat "Mutowalności" pamięci...
Musimy teraz zgłębić bardzo ważny problem tego, jak zmienne przechowują wartości w pamięci. Zrozumienie tego jest kluczowe, aby unikać ukrytych i wrednych błędów (bugów) niszczących gry.
Podstawowe typy które dziś poznaliśmy (int, float, bool, str) są tak zwanymi obiektami niemutowalnymi (immutable). Ich wnętrza nie da się modyfikować po stworzeniu. Można jedynie stworzyć nową wartość w nowym miejscu w szafie i przepiąć strzałkę.
Spójrzmy na ten z pozoru łatwy kawałek kodu z liczbami:
a = 20) w żaden sposób nie psuje tej drugiej (b zostaje przy 10).
Nie wszystkie elementy języka są tak bezpieczne. Z czasem zaczniemy używać w Pythonie "złożonych" struktur danych. Jedną z najczęstszych są Listy (tablice ekwipunku, zbiory danych).
Co się stanie, jeśli skopiujemy zmienną wskazującą na listę? Zamiast "ksera", dostaniemy wspólne drzwi do tego samego pokoju!
Aby naprawić ten problem i stworzyć fizyczną KOPIĘ pudełka z nowym adresem, musimy wymusić na Pythonie skserowanie (skopiowanie) całej listy za pomocą dodatkowej komendy, np: .copy().
To najbardziej ustrzeże Cię przed wrednymi błędami współdzielenia danych w złożonych programach!