Seite 1 von 1

Zirkelschluss

Verfasst: Dienstag 15. Juni 2010, 21:22
von Peak_me
hallo!

Mir war eben so, als hätte ich die gleiche Frage schonmal gehabt und habe alle meine Beiträge hier durchgeschaut.
Doch es war nichts dabei :D

Code: Alles auswählen

a=[0,1]
c=[9,9]

x=a
x.append(c)
a soll sich während der Operation nicht verändern!
tut es aber, wie man an der Ausgabe von

Code: Alles auswählen

a=[0,1]
c=[9,9]

x=a
print a
x.append(c)
print a
erkennen kann.

Eigentlich dachte ich, dass eine Zuweisung wie nur in eine Richtung ginge, d.h. dass z den Wert von y annimmt und y unverändert bliebe.
In meinem Beispiel findet aber scheinbar ein Zirkelschluss zwischen beiden Variabeln statt.
Ich möchte aber, dass nur x verändert wird und a unverändert bleibt.
Wie kann ich das erreichen?


Gruß
Paul

Re: Zirkelschluss

Verfasst: Dienstag 15. Juni 2010, 21:27
von BlackJack
@Peak_me: Es verändert sich weder `a` noch `x` sondern das *Objekt* was an diese beiden Namen in Deinem Beispiel gebunden ist. ``x = a`` heisst nichts anderes als binde den Namen `x` an das Objekt das an den Namen `a` gebunden ist. Wenn Du eine Kopie haben möchtest musst Du explizit eine erstellen. In diesem Fall zum Beispiel mit ``x = list(a)``.

Re: Zirkelschluss

Verfasst: Dienstag 15. Juni 2010, 21:27
von Hyperion
Du suchst das copy-Modul :-)

Re: Zirkelschluss

Verfasst: Dienstag 15. Juni 2010, 22:14
von sma

Code: Alles auswählen

x = a[:]
oder

Code: Alles auswählen

x = list(a)
Stefan

Re: Zirkelschluss

Verfasst: Mittwoch 16. Juni 2010, 14:52
von Peak_me
danke; es funktioniert!

Jetzt ist es ja unter meinem Namen hier archiviert. Da ich dieses Problem in vorraussichtlich einem halben Jahr wieder haben werde, kann ich dann einfach nachschauen :)

Re: Zirkelschluss

Verfasst: Donnerstag 17. Juni 2010, 22:03
von Peak_me
Ich komm einfach nicht drauf klar...
Eure Hilfen haben mir zwar weitergeholfen, doch jetzt funktioniert es wieder nicht.

Code: Alles auswählen

k=[[1, 2, 3, 4], [6, 4, 3, 2], [2, 2, 8, 10]]
w=['I', 'I', 'T', 'U', 'E', 'A', 'N', 'D', 'E', 'A', 'E']

ks=k[:]

for i in range(len(ks)):
    for j in range(len(ks[i])):
        pks=ks[i]
        pks[j]=w[pks[j]]
Die Zahlen in k sollen durch Buchstaben aus w ersetzt werden, wobei ich die alte k-Liste noch brauche.
Es soll also eine neue Liste erstellt werden und k soll nicht verändert werden.
Doch weder ks=k[:] noch ks=list(k) funktioniert; auch k wird mit Buchstaben gefüllt.
Ich habe dann einfach

Code: Alles auswählen

k=[[1, 2, 3, 4], [6, 4, 3, 2], [2, 2, 8, 10]]
w=['I', 'I', 'T', 'U', 'E', 'A', 'N', 'D', 'E', 'A', 'E']

ks=k[:]

for i in range(len(ks)):
    for j in range(len(ks[i])):
        pks=list(ks[i])
        pks[j]=w[pks[j]]
        ks[i]=pks
ausprobiert und das funktioniert.
Doch eigentlich müsste es ja auch das erste Beispiel tun.
Wieso wird k jedoch verändert?


Gruß
Paul

Re: Zirkelschluss

Verfasst: Donnerstag 17. Juni 2010, 22:40
von /me
Peak_me hat geschrieben:Wieso wird k jedoch verändert?
Möge es jemand anders erklären, ich hab' jetzt gerade keine Zeit.

Was du brauchst ist deepcopy().

Re: Zirkelschluss

Verfasst: Freitag 18. Juni 2010, 05:46
von DasIch
k wird nicht verändert sondern die Listen die sich in k befinden.

Re: Zirkelschluss

Verfasst: Freitag 18. Juni 2010, 08:46
von Hyperion
Ersteres Problem kann man so lösen:

Code: Alles auswählen

In [1]: k=[[1, 2, 3, 4], [6, 4, 3, 2], [2, 2, 8, 10]]

In [2]: w=['I', 'I', 'T', 'U', 'E', 'A', 'N', 'D', 'E', 'A', 'E']

In [3]: import copy

In [4]: ks = copy.deepcopy(k)

In [5]: ks
Out[5]: [[1, 2, 3, 4], [6, 4, 3, 2], [2, 2, 8, 10]]
Das Ersetzen dann ggf. so:

Code: Alles auswählen

In [14]: pks = [map(w.__getitem__, group) for group in ks]

In [15]: pks
Out[15]: [['I', 'T', 'U', 'E'], ['N', 'E', 'U', 'T'], ['T', 'T', 'E', 'E']]
Wobei man hier keine Kopie von k benötigt, weil eine komplett neue Liste aufgebaut wird!