Zirkelschluss

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

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
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)``.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du suchst das copy-Modul :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

x = a[:]
oder

Code: Alles auswählen

x = list(a)
Stefan
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

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 :)
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

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
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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().
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

k wird nicht verändert sondern die Listen die sich in k befinden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten