någon som är bra på python 2/3 och arrayer/listor?

Permalänk
Medlem

någon som är bra på python 2/3 och arrayer/listor?

Hej!

Jag gör ett spel där man ska kunna flytta en gubbe över ett y-x grid format fält. tänk er som schack.

Iaf, jag vill göra en kopia av spelplanen som innehåller tecken såsom # och O mm.

problemet är att jag försöker ändra i kopian, men då kommer ändringarna finnas i originalet med. T ex.

board = [['#']['#']] objmap = board[:] for row in range(len(objmap)): for box in range(len(objmap[row])): if objmap[row][box] == '#' or objmap[row][box] == 'O': objmap[row][box] = ' '

Jag vet inte varför eller vad som är problemet. Det är som att objmap blir en referens till board, men objmap är slicad så hur fasen är det möjligt.

Ja jag har provat objmap = list(board), och även att appenda innehållet i board till objmap :S

Visa signatur

No man is free who is not master of himself

Permalänk
Medlem

Det är bara den yttre listan som har kopierats, men båda kopiorna pekar på samma inre listor, ['#'] och ['#']. Detta kallas för en shallow copy, medan det du vill ha är en deep copy.

http://docs.python.org/library/copy.html

Jag har illustrerat din situation så bra jag kan:

['#'] / \ | \ | [ , ] board objmap [ , ] | \ / \ / ['#']

Permalänk
Medlem

För mig fungerar det att slica som du gör(om jag inte missförstått din kod):

>>> def b(lista): ... hej = lista[:] ... print(lista) ... hej[0] = 1 ... print(lista) ... >>> a = [0] >>> b(a) [0] [0]

Kör PythonWin 2.7.3.

EDIT: Fungerar dock inte på nästlade listor nu när jag testade.

EDIT#2:

Deepcopy fungerar dock, som tufflax påpekar:

>>> import copy >>> def b(lista): ... hej = copy.deepcopy(lista) ... print(lista) ... hej[1][0] = 'a' ... print(lista) ... >>> a = [[0], [1]] >>> b(a) [[0], [1]] [[0], [1]]

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem

aha, jag provade det här tidigare, men fick samma resultat.

import copy

objmap = copy.deepcopy(board)

men jag tror inte det fungerade bättre.

Visa signatur

No man is free who is not master of himself

Permalänk
Medlem
Skrivet av Luminous:

aha, jag provade det här tidigare, men fick samma resultat.

import copy

objmap = copy.deepcopy(board)

men jag tror inte det fungerade bättre.

Det ska göra det, tror jag, testa igen.

Permalänk
Medlem

hey, det verkar fungera med objmap = copy.deepcopy(board) den här gången.

nåt gjorde jag nog fel, hoppas jag kan greja det här nu Tack för hjälpen iaf!

Visa signatur

No man is free who is not master of himself

Permalänk
Medlem
Skrivet av ToJa92:

För mig fungerar det att slica som du gör(om jag inte missförstått din kod):

>>> def b(lista): ... hej = lista[:] ... print(lista) ... hej[0] = 1 ... print(lista) ... >>> a = [0] >>> b(a) [0] [0]

Kör PythonWin 2.7.3.

EDIT: Fungerar dock inte på nästlade listor nu när jag testade.

EDIT#2:

Deepcopy fungerar dock, som tufflax påpekar:

>>> import copy >>> def b(lista): ... hej = copy.deepcopy(lista) ... print(lista) ... hej[1][0] = 'a' ... print(lista) ... >>> a = [[0], [1]] >>> b(a) [[0], [1]] [[0], [1]]

Man ser ju dock inte att det funkar i din kod.

Permalänk
Medlem

jag känner mig som en idiot som provar det här igen, men jag måste ha gjort nåt annat fel då.

Som einstein sa, bara en idiot provar samma sak flera gånger och förväntar sig ett annat resultat

Visa signatur

No man is free who is not master of himself

Permalänk
Medlem
Skrivet av tufflax:

Man ser ju dock inte att det funkar i din kod.

Nej, jag kom på det efter att jag ändrade inlägget och provade lokalt, men eftersom problemet redan var löst orkade jag inte ändra mitt inlägg.

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.