[python]list wordt overschreven?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Smuggler
  • Registratie: Juni 2005
  • Laatst online: 28-05 17:19

Smuggler

Wat wil jij nu echt bereiken?

Topicstarter
Hallo medetweakers,
Ben afgelopen zondag voor het eerst in aanraking gekomen met de script/programmeer taal python.
op aanraden van een vriend die dacht, dat het voor mijn doel een handig middel zal zijn.

ik snap alleen niet wat er nu gebeurd, volgens mijn logica werkt het. maar python is eigenwijs (de aanhouder wint?)

ik heb het volgende stukje code(tot echt de bron verkleint waar het probleem zit:
code:
1
2
3
4
5
6
7
8
9
10
import random #haal wat libaries op
schema = list() #maak een lijst aan
lol = list() #maak lijst 2 aan
lol = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6] #vul de lijst lol met gegevens
print lol # laat zien wat erin staan
schema.append(lol) #stop dit in "schema" als list
print schema #laat het schema zien
random.shuffle(lol) #hutsel de lijst van lol door elkaar
print lol #laat lol zien.
print schema # laat schema zien

Dit is wat ik eruit krijg:
code:
1
2
3
4
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
[[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]]
[5, 4, 5, 2, 6, 4, 6, 3, 3, 4, 5, 6, 2, 1, 1, 1, 2, 3]
[[5, 4, 5, 2, 6, 4, 6, 3, 3, 4, 5, 6, 2, 1, 1, 1, 2, 3]]

terwijl ik het volgende verwacht eigenlijk:
code:
1
2
3
4
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
[[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]]
[5, 4, 5, 2, 6, 4, 6, 3, 3, 4, 5, 6, 2, 1, 1, 1, 2, 3]
[[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]]


ik zie dus dat als ik "lol" verander, dit ook mee veranderd in "schema"
terwijl imo dat in schema moet blijven staan omdat ik dat daar naar toe heb gekopieerd met append, en dus niets meer van doen heeft met "lol"

uiteindelijk wil ik dus een schema hebben zoals : schema[lol,lol,lol,lol] waarbij elke lol een andere waarde heeft. en bereikbaar is met "schema[0].pop" zodat ik de laatse waarde uit de eerste lijst zo kan ophalen

nu mijn vragen:
- is het duidelijk wat ik wil?
- pas ik list wel op de juiste manier toe?
- moet ik zoeken naar iets anders? (een hint in de juiste richting is meer dan genoeg).
- een oplossing zal mooi zijn

9.900Wp PV (enphase), 55kwh EV(Tesla), 35kwh EV(MG), 6kWh thuisbatterij (EVAPOWER), Tibber


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je voegt een verwijzing naar de list "lol" toe aan de list "schema", daarna ga je de list "lol" shufflen, en dat resultaat zal je dus ook weer terug zien als je schema opnieuw print. Je zult dus een kopie van "lol" moeten maken en die toevoegen aan schema.
Smuggler schreef op dinsdag 18 januari 2011 @ 13:19:
terwijl imo dat in schema moet blijven staan omdat ik dat daar naar toe heb gekopieerd met append, en dus niets meer van doen heeft met "lol"
Je kopieert niet de inhoud van "lol" naar "schema" meer een verwijzing van "lol".

Kijk eens naar http://docs.python.org/library/copy.html

[ Voor 43% gewijzigd door Woy op 18-01-2011 14:09 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 16:02

RayNbow

Kirika <3

Smuggler schreef op dinsdag 18 januari 2011 @ 13:19:
Python:
3
4
lol = list() #maak lijst 2 aan
lol = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6] #vul de lijst lol met gegevens
Aan de hand hiervan zie ik dat je niet precies snapt wat er nu daadwerkelijk gebeurt. In Python verwijst een variabele naar een object in het geheugen. Met = kun je een variabele naar een ander object laten wijzen. Het object waar eerder naar werd verwezen door de variabele wordt echter niet aangepast:

1. schema = list()


  |--------|
  | schema |o----> []
  |--------|


2. lol = list()

  |--------|
  | schema |o----> []
  |--------|

  |--------|
  |  lol   |o----> []
  |--------|


3. lol = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6]


  |--------|
  | schema |o----> []
  |--------|

  |--------|
  |  lol   |o--- x []
  |--------|   |
               |
               ---> [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6]


6. schema.append(lol)

  |--------|
  | schema |o----> [o]
  |--------|        |
                    |
  |--------|        |
  |  lol   |o---    |
  |--------|   |    |
               |    v
               ---> [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6]



Je kunt trouwens i.p.v schema = list() ook gewoon schema = [] doen.
Woy schreef op dinsdag 18 januari 2011 @ 14:08:
Je voegt een verwijzing naar de list "lol" toe aan de list "schema", daarna ga je de list "lol" shufflen, en dat resultaat zal je dus ook weer terug zien als je schema opnieuw print. Je zult dus een kopie van "lol" moeten maken en die toevoegen aan schema.

[...]

Je kopieert niet de inhoud van "lol" naar "schema" meer een verwijzing van "lol".

Kijk eens naar http://docs.python.org/library/copy.html
In het geval van lijsten kun je ook het volgende doen:
Python:
1
2
3
4
xs = [1,2,3]
ys = list(xs)                 # nieuwe kopie
zs = xs[:]                    # ook een nieuwe kopie
print id(xs), id(ys), id(zs)  # identities (=geheugenadressen) van de objecten

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Smuggler
  • Registratie: Juni 2005
  • Laatst online: 28-05 17:19

Smuggler

Wat wil jij nu echt bereiken?

Topicstarter
jullie zijn geweldig _/-\o_
ys = list(xs), deed de truc direct :D
ik begrijp python ook meteen een stuk beter volgens mij.
zal nog even kijken naar de rest van de informatie.
is wel even anders denken dan in C dus, qua kopieeren, maar dat went wel denk ik :).

9.900Wp PV (enphase), 55kwh EV(Tesla), 35kwh EV(MG), 6kWh thuisbatterij (EVAPOWER), Tibber


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Smuggler schreef op dinsdag 18 januari 2011 @ 16:32:
is wel even anders denken dan in C dus, qua kopieeren, maar dat went wel denk ik :).
Op zich valt het wel mee. In C worden dingen alleen standaard by value doorgegeven, en in Python standaard by ref. Het is ongeveer hetzelfde als een pointer doorgeven in C.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 16:02

RayNbow

Kirika <3

Woy schreef op dinsdag 18 januari 2011 @ 16:38:
[...]

Op zich valt het wel mee. In C worden dingen alleen standaard by value doorgegeven, en in Python standaard by ref. Het is ongeveer hetzelfde als een pointer doorgeven in C.
In C wordt die pointer byval doorgegeven en in Python worden alle object references dat dus ook. ;)

Python:
1
2
3
4
5
6
7
x = 2

def foo(y):
    y = 3  # als byref, dan is y straks een alias voor x

foo(x)
print x

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
RayNbow schreef op dinsdag 18 januari 2011 @ 17:16:
[...]
In C wordt die pointer byval doorgegeven en in Python worden alle object references dat dus ook. ;)

Python:
1
2
3
4
5
6
7
x = 2

def foo(y):
    y = 3  # als byref, dan is y straks een alias voor x

foo(x)
print x
Ok het ligt inderdaad wat genuanceerder. het ging me over het feit dat objecten zelf niet by value doorgegeven worden in Python en in c ( structs ) en C++ (structs/objecten) wel, en dat de Python manier vergelijkbaar is met een pointer naar een object/struct by value meegeven ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Regel 3 uit je eerste codevoorbeeld kun je trouwens weglaten.

Wat is trouwens de 'beste' manier om zo'n copy van een list te maken? copy(), deepcopy(), list(l)? Het maakt qua leesbaarheid allemaal niet zo'n verschil....

[ Voor 56% gewijzigd door mcdronkz op 18-01-2011 18:34 ]


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
mcdronkz schreef op dinsdag 18 januari 2011 @ 18:29:
Wat is trouwens de 'beste' manier om zo'n copy van een list te maken? copy(), deepcopy(), list(l)? Het maakt qua leesbaarheid allemaal niet zo'n verschil....
Ik zie meestal de list[:] syntax gebruikt worden, die al eerder genoemd was. Een slice van de hele list is een nieuwe list.

deepcopy doet wat anders dan copy, het ligt net aan de situatie welke je nodig hebt. Voor de rest zal het weinig uitmaken.

Acties:
  • 0 Henk 'm!

  • Gimmeabrake
  • Registratie: December 2008
  • Laatst online: 07:27
Naast dat alles by reference is in python(nouja, dat geloof ik dan maar, ik heb zelf nog nooit met python gewerkt), viel mij een tweede fout op: je voegde niet de items van de tweede list toe, maar de list eerste list als enkel item. Dit had je als je goed op had gelet ook kunnen zien bij je output:
code:
1
2
3
4
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
[[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]]
[5, 4, 5, 2, 6, 4, 6, 3, 3, 4, 5, 6, 2, 1, 1, 1, 2, 3]
[[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]]

Als je goed kijkt zie je dat de items in schema tussen 2 paar brackets zitten, en in lol tussen 1 paar brackets. Dat wil zeggen dat schema lengte 1 had, en dat item 1 de gehele list lol was. Misschien dat dat al duidelijk was geworden, maar ik zag het nog niet letterlijk in de thread staan. :)

Edit: lees het nog een keer en zie nu dat Woy het al goed gezegd had :P mijn leesvaardigheden zijn echt droevig vandaag :X

[ Voor 7% gewijzigd door Gimmeabrake op 18-01-2011 19:38 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • Smuggler
  • Registratie: Juni 2005
  • Laatst online: 28-05 17:19

Smuggler

Wat wil jij nu echt bereiken?

Topicstarter
gerrymeistah schreef op dinsdag 18 januari 2011 @ 19:36:
Naast dat alles by reference is in python(nouja, dat geloof ik dan maar, ik heb zelf nog nooit met python gewerkt), viel mij een tweede fout op: je voegde niet de items van de tweede list toe, maar de list eerste list als enkel item. Dit had je als je goed op had gelet ook kunnen zien bij je output:
code:
1
2
3
4
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
[[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]]
[5, 4, 5, 2, 6, 4, 6, 3, 3, 4, 5, 6, 2, 1, 1, 1, 2, 3]
[[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]]

Als je goed kijkt zie je dat de items in schema tussen 2 paar brackets zitten, en in lol tussen 1 paar brackets. Dat wil zeggen dat schema lengte 1 had, en dat item 1 de gehele list lol was. Misschien dat dat al duidelijk was geworden, maar ik zag het nog niet letterlijk in de thread staan. :)

Edit: lees het nog een keer en zie nu dat Woy het al goed gezegd had :P mijn leesvaardigheden zijn echt droevig vandaag :X
ja, dat had ik al gezien :)
maar heb de code erg verkort. zodat jullie niet opgezadeld zouden zitten met de rest van de code :P.
dit is er bijvoorbeeld na 5 minuten zichtbaar in die lijsten:
[[6, 4, 2, 0, 3, 2, 5, 4, 1, 1, 0, 5, 1, 3, 5, 0, 3, 4, 2], [4, 2, 3], [1, 5, 1, 5, 3, 5, 3, 0, 2, 2, 4, 4, 0, 2, 0, 1, 3, 4], [3, 0, 4, 4, 5, 2, 1, 0, 4, 0, 3, 1, 2, 1, 5, 2, 5, 3], [4, 5, 3, 4, 1, 0, 3, 4, 1, 2, 1, 0, 0, 3, 5, 5, 2, 2], [3, 0, 0, 1, 5, 0, 4, 2, 5, 4, 5, 2]]

het werkt, en ben al een stuk wijzer geworden.

9.900Wp PV (enphase), 55kwh EV(Tesla), 35kwh EV(MG), 6kWh thuisbatterij (EVAPOWER), Tibber

Pagina: 1