Hyllorna

Vad händer med enemy47?

Föreställ dig att du bygger ett spel med femtio fiender. Du börjar skapa fiender med det du kan, variabler, enemy1 = "Goblin", enemy2 = "Troll", enemy3 = "Drake", och så vidare tills enemy50 = "Lich". Det är femtio separata variabler och femtio separata tilldelningsrader. Och här kommer det värsta: du har precis lärt dig loopar, men du kan inte loopa över femtio variabelnamn. for-loopen har ingenting att iterera över, varje enemy är sin egen isolerade låda. Vill du skriva ut alla femtio är det femtio print()-satser, loop eller inte.

Resultatet är inte rimligt eller praktiskt, men som tur är handlar det mest om att du ännu har inte rätt verktyg för jobbet. När du märker att du kopierar variabelnamn med siffror, enemy1, enemy2, enemy3, är det ett tecken på att du behöver en lista.

En Lista En ordnad, föränderlig samling av värden lagrade under ett enda variabelnamn. Skapas med hakparenteser och kommaseparerade värden. Se: Hyllorna i Python är en ordnad samling av värden lagrade under ett enda variabelnamn. Femtio fiendenamn ryms i en lista. Hundratusen produktpriser ryms i en lista. Och i nästa del, Listan & loopen, kopplas listan ihop med for för att göra något med varje element, oavsett om listan innehåller fem eller femtusen fiender.

Listor, en ordnad samling

En lista skapas med hakparenteser och kommaseparerade värden:

Editor

Redo.

Kör koden: hela samlingen skrivs ut på en gång, hakparenteser och allt. Lägg till ett fjärde fiendenamn i fiender och kör igen, en rad att ändra, inte en ny variabel att uppfinna.

Tänk på listan som en hylla i ett lager, en rad med fack, vart och ett med plats för ett värde. Hela hyllan har ett namn, och Python håller ordning på facken åt dig.

Listor i minnet

I Lådor i RAM & datatyper beskrev vi RAM som ett gigantiskt rutnät av adresser. En lista lagrar sina element i ett sammanhängande block av sådana adresser, en faktisk hylla i minnet.

En lista är ett namn på flera intilliggande fack i minnet, och nya element läggs till i slutetGoblin2400Troll2401Drake2402växer hit2403fienderett sammanhängande block av adresser

Bilden bär delens hela poäng. Etiketten fiender är ett enda namn på hela raden fack, inte på ett av dem, och det är därför femtio fiender ryms i en variabel. Facken ligger dessutom bredvid varandra, och det är det som gör att .append() alltid vet var nästa värde ska hamna: i det första lediga facket efter det sista.

Lägga till och ta bort element

.append() lägger till ett nytt element i slutet:

Editor

Redo.

Kör och jämför de två utskrifterna. .remove() tar bort den första förekomsten av ett specifikt värde, inte alla. Redigera koden ovan så att "Troll" står med två gånger i listan, lägg till fiender.remove("Troll") och skriv ut listan en tredje gång. Bara det ena försvinner. Listan bryr sig inte om att det fanns en till.

len(), hur lång är listan?

Editor

Redo.

len() returnerar antalet element. Kör, lägg till en fiende med .append(), kör igen. Listan vet alltid själv hur lång den är, du behöver aldrig räkna facken manuellt.

Uppgift: Spelarens inventory

Ett inventory i ett spel är ingenting annat än en lista: föremål läggs i, plockas ur, och spelet behöver alltid veta hur många som finns. Skapa filen inventory.py.

  1. Skapa en lista inventory med minst fem föremål som strängar.

  2. Skriv ut hela listan med ett beskrivande meddelande.

  3. Spelaren hittar ett nytt föremål: lägg till det med .append() och skriv ut listan igen.

  4. Spelaren använder ett föremål: ta bort det med .remove() och skriv ut listan.

  5. Skriv ut hur många föremål som finns kvar med len() och en f-sträng.

  6. Stagea filen via Source Control-panelen i VS Code, skriv ett commit-meddelande och pusha.

Vad händer om

Låt spelaren använda samma föremål en gång till: kör .remove() med ett värde som inte längre finns i listan. Vad svarar Python, och var i din kod skulle du behöva ett villkor för att skydda dig?

Motivera & reflektera

Motivera varför en lista är rätt verktyg för inventoryt i stället för fem separata variabler. Vad blir enklare direkt, och vad händer den dag inventoryt ska rymma femtio föremål?