0%

Lijsten · oefening

Als twee namen een lijst delen

Een lijst kan zelf veranderen. Dat levert een verrassing op als je dezelfde lijst aan een tweede naam toewijst: een toewijzing maakt niet automatisch een momentopname.

Try it

Beide namen tonen het nieuwe item. De toewijzing shared_plan = weekend heeft de lijst niet gekopieerd. Ze heeft één lijst een tweede naam gegeven.

Nu de verrassing zichtbaar is, kunnen we bewust een oplossing kiezen.

Maak een afzonderlijke lijst als wijzigingen gescheiden moeten blijven

Roep .copy() aan als je een onafhankelijke buitenste lijst nodig hebt:

Try it

Nu beginnen de lijsten met gelijke items, maar kunnen ze onafhankelijk veranderen. .copy() heeft een duidelijk doel, omdat we het probleem hebben gezien dat het oplost.

Een toewijzing laat weekend en shared_plan naar één gewijzigde lijst verwijzen, terwijl copy() separate_plan een onafhankelijke lijst geeft.

De oefening aan het einde van deze les maakt beide verbanden in één programma. Na append() is het gedeelde object veranderd. Daardoor zie je de wijziging via beide namen, terwijl de afzonderlijke kopie hetzelfde blijft. In het diagram staat assignment voor toewijzing met twee namen en één lijst; copy voor twee namen en twee lijsten.

Dit verschil verklaart gedrag dat anders verrassend kan zijn:

Try it

alias veranderen wijzigt ook original, omdat die namen naar dezelfde lijst verwijzen. De gekopieerde lijst houdt 10 als eerste item.

Wat drukt deze code af?

colors = ["red", "blue"]
other = colors
saved = colors.copy()
other.append("green")
print(colors)
print(saved)

Bij deze lijsten met strings en getallen is een nuttige vraag: ‘Moeten deze twee namen dezelfde toekomstige wijzigingen zien?’ Zo ja, dan kan een toewijzing geschikt zijn. Zo nee, maak dan een kopie.

Het woord buitenste is belangrijk: .copy() maakt een nieuwe lijst, maar kopieert niet ook de objecten daarin. Als een item zelf een veranderbare lijst is, verwijzen beide buitenste lijsten nog steeds naar hetzelfde binnenste item. Dit heet een oppervlakkige kopie, of shallow copy. De strings en getallen in onze voorbeelden kunnen zelf niet veranderen. Een item vervangen in een van de buitenste lijsten laat de andere lijst daarom ongemoeid.

Opdracht

Maak het programma af, zodat het beide soorten verbanden maakt:

  • Maak van shared_plan een andere naam voor de bestaande lijst weekend.

  • Maak van separate_plan een afzonderlijke kopie.

  • Behoud de gegeven append-bewerking.

  • Vervang het eerste item in separate_plan door "cycle".

  • Druk alle drie de lijsten af.

Het toegevoegde item moet zichtbaar zijn via weekend en shared_plan, maar niet in separate_plan.

Klik op Step in de werkbalk van de editor zodra het programma werkt. Loop er met Next doorheen en bekijk het variabelenpaneel. Als weekend.append("cook") wordt uitgevoerd, veranderen weekend en shared_plan samen, omdat het twee namen voor één lijst zijn. separate_plan verandert niet. Daar zie je het hele idee van deze les in één moment.