Liste referenzieren

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
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Hallo,
ich hab grad ein recht simples Anfänger Problem, vllt sitz ich auch einfach aufm Schlauch.

Wenn ich eine Liste hab

Code: Alles auswählen

x = [1, 2]
Und nun diese Liste in y "speicher"

Code: Alles auswählen

y = x
Und jetzt y bearbeiten möchte

Code: Alles auswählen

y.remove(1)
Dann gibt

Code: Alles auswählen

print(x)
Plötzlich ja auch blos noch "[10]" aus.
Kann ich die Liste irgendwie in einer Variable speichern und bearbeiten, ohne dass die Ursprüngliche Liste verändert wird?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, indem man die Liste kopiert. Einfach oder tief, letzteres mit copy.deecopy, ersteres mit list(meine_liste)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das im Grunde nicht die ”pythonische” Lösung ist. Die wäre eine neue Liste zu erstellen, ohne die Elemente die entfernt werden sollen, statt tatsächlich Elemente aus einer bestehenden Liste zu entfernen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Danke, __deets__ Lösung hats gebracht :-)
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Phobit hat geschrieben: Samstag 18. Januar 2020, 16:46 Wenn ich eine Liste hab

Code: Alles auswählen

x = [1, 2]
Und nun diese Liste in y "speicher"

Code: Alles auswählen

y = x
Denk dir das lieber anders. Du hast eine Liste `[1, 2]`. An diese Liste bindest du einen Namen `x`. Anschließend bindest du an die gleiche Liste auch den Namen `y`. Zuweisungen kopieren keine Daten, sondern binden nur Namen an Objekte.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Phobit hat geschrieben: Samstag 18. Januar 2020, 17:30 Danke, __deets__ Lösung hats gebracht :-)
Warum sind es immer die schlechten Lösungen, die genommen werden?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil ohne Kontext eine bessere Lösung schwer lieferbar ist, und weil die Konzepte „Dinge die an zwei Namen gebunden sind, sind nicht unterschiedlich“ und „List-Comprehension mit Filter“ oä nicht zwangsweise in einem Rutsch gelehrt und vor allem verstanden werden. Ganz besonders beim TE, dessen Signatur den Unwillen zum guten Code ja ausdrückt 🤷🏼‍♂️
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Also.
TE, dessen Signatur den Unwillen zum guten Code ja ausdrückt 🤷🏼‍♂️
"Guter Code" ist relativ. Meine Codes sind nicht OpenSource, also müssen sie nicht so klar strukturiert sein, dass sie jeder auf Anhieb versteht. Desweiteren mach ich meine Codes nicht "universell", also nutze den selben Code nicht für mehrere Projekte, deswegen kann er auf ein Projekt speziell spezialisiert sein.
Warum sind es immer die schlechten Lösungen, die genommen werden?
Und was deets oben geschrieben hat, also y = list(x) funktioniert perfekt für das, was ich brauche. Wieso sollte ich also jetzt anfangen da mords Module reinzuklatschen oder den Code statt auf 1er auf 15 Zeilen zu schreiben, wenn der simple Befehl doch perfekt ausreicht? Nur damit er am Ende schöner aussieht?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Zur Lesbarkeit des Codes: Das soll jedem Leser helfen. Vor allem aber dir selbst. Irgendwann wirst du einen Code von dir selbst lesen, den du nicht gestern geschrieben hast, und dann sehr glücklich sein, wenn er verständlich geschrieben ist.

Dein Kommentar mit den Kommentaren zu dem Einbinden von Modulen bezüglich des "pythonischen Weges", denn das ist ja was hier vorher aufgezeigt wurde, ist vor allem trotzig. Und zeigt, dass du es nicht verstanden hast. Statt eine Kiste zu kopieren, erstellt man sie aus der alten und wählt dabei die Einträge, die man behalten möchte. Dafür kann es Module geben, die beim Selektieren helfen, aber am Ende ist es auf jeden Fall weniger Code (und vor allem effizienter) anstatt erst eine ganze Liste zu kopieren und dann die Einträge wieder zu löschen, die man nicht braucht.

Am Ende ist es wie mit allem im Leben: du hast die Wahl. Entweder entwickelst du dich aktiv weiter oder du ignorierst jeden Rat und bleibst auf Frickelniveau.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Aber mir gehtes ganz konkret drum, dass ich die Elemente im nachhinein entferne. Ich weiß noch nicht, welche Entfernt werden müssen, dafür mein Code (ja ich habe absichtlich keinen Kontext geliefert.) Deshalb finde ich es sinnvoller, derweilen mit der neuen Liste zu arbeiten, weil ich blos da was entfernen muss, die Standartliste muss er´há´ltén werdén. Wie gesagt, für das was ich konkret vorhatte, hats mehr als gereicht. Mag sein dass es in anderen Fällen andere, sinnvollere Wege gäbe. Aber hier brauch ich die nicht.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du bist überhaupt nicht kompetent genug, um zu beurteilen, wie eine gute Lösung für dein Problem aussieht. Aber das du darauf bestehst, und sogar stolz darauf bist, ignorant zu sein und zu bleiben, ist hinlänglich bekannt.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Wenn sie einwandfrei funktioniert, ist sie gut. Es wird bessere geben, klar, aber sie funktioniert immerihn.

Ich das ganze halt sinnlos. Ich bin kein beruflicher Informatiker, ich programmiere Hobbymäßig, da brauch ich keine Codes mit denen ich ne Masterarbeit schreiben kann, mir persönlich reicht es wenn es funktioniert. Da ist es egal ob das eine gute oder schelchte Einstellung ist, weil mir.reicht.das. Mag Ignoranz sein, aber dann ist es halt ignoranz *schulterzuck*

Und wenn die Lösung von dir soooo schrecklich ist, dass wir schon wieder 10mal drüber diskutieren müssen, dann hättest du mir einfach gleich die bessere Möglichkeit oder gar keine schreiben können. Ich nehme jede Hilfe dankbar an, aber am liebsten die leichteste. Hättest du mir gleich eine kompliziertere aber bessere geschickt, hätte ich mich auch nicht beschwert, wenn sie funktioniert.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Phobit hat geschrieben: Sonntag 19. Januar 2020, 13:15 Und was deets oben geschrieben hat, also y = list(x) funktioniert perfekt für das, was ich brauche.
Mein Problem mit deinem Lernansatz ist, dass du meiner Meinung nach keinen hast. Ja, in diesem Kontext funktioniert es, aber ich habe nicht das Gefühl, dass du in einer vermeintlich ähnlichen Situation verstehen würdest, warum es dann plötzlich doch nicht funktioniert. Schlimmer noch, ich habe das Gefühl du würdest nicht mal suchen, sondern direkt eine Frage ins nächstbeste Forum klatschen.

Als Fragesteller ist deine Erwartungshaltung an die Forenmitglieder, dass sie dir eine Lösung liefern. Wie und warum die Lösung so aussieht wie sie aussieht interessiert dich weniger. Meine Erwartung als Antwortender ist, dass die Fragenden sich mit dem Thema auseinandersetzen, das sie interessiert. Dazu gehört natürlich im Wesentlichen auch das Bemühen um das Verständnis dafür, warum die Antwort so aussieht wie sie aussieht.

Wir beiden kommen innerhalb dieses Forums wohl nicht mehr mit unseren Interessen zusammen. Zwischen uns funkt es zwar vielleicht, es funktioniert aber auf keinen Fall.

[Irgendwie musste das jetzt mal raus]
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich antworte dem guten Phobit normalerweise auch nicht mehr, wegen seiner bezaubernden Art. War also nur ein Versehen. Ich habe durchaus Verständnis dafür, das nicht alles und jedes perfekt sein kann oder muss. Sich zu gegebenen Ratschlägen aber dermaßen offensiv arschig zu geben braucht keiner.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Angenommen ich möchte ein Eis am Stiel, dann kann ich mir eins kaufen. Ich könnte aber auch einen Zehnerpack kaufen und neun wegschmeißen. Funktioniert auch. Ist mir doch egal. Doof nur: wenn ich ein zweites Eis will, muß ich schon wieder einen Zehnerpack kaufen. Das dies besser geht, wird mir dann mitgeteilt. Für diese Mitteilung haben sich andere Mühe gegeben. Befolge ich aber nicht. Und irgendwann wundere ich mich, dass mir auf Fragen keiner mehr antwortet.
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

kbr hat geschrieben: Sonntag 19. Januar 2020, 15:28 Angenommen ich möchte ein Eis am Stiel, dann kann ich mir eins kaufen. Ich könnte aber auch einen Zehnerpack kaufen und neun wegschmeißen. Funktioniert auch. Ist mir doch egal. Doof nur: wenn ich ein zweites Eis will, muß ich schon wieder einen Zehnerpack kaufen. Das dies besser geht, wird mir dann mitgeteilt. Für diese Mitteilung haben sich andere Mühe gegeben. Befolge ich aber nicht. Und irgendwann wundere ich mich, dass mir auf Fragen keiner mehr antwortet.
Aber so gesehen, wäre das Zehnerpack teurer und aufwendiger zum kaufen, als das einzelne. Würde also bei dem einzelnen Eis bleiben. Der Vergleich geht nach hinten los ^^

-----

Mein allgemeines Problem mit dem Forum hier ist, ich kann die meisten hier nicht leiden (komme gleich zu meinem Grund, beruht doch eh auf Gegenseitigkeit<3), da ihr alle aber eigentlich super gut informiert seid bin ich auf euch angewiesen, wie viele andere Forumsnutzer auch. Bloß, wie in vielen anderen Foren gibt es das folgendes Problem:
Nehme man mein Problem, möchte liste x in y speichern und dann y verändern ohne x zu verändern. Und dann passiert "in a nutshell" folgendes:
Person A sagt "Mach dasundides, dann gehts".
Person B sagt "Machs ganz anders:" (3 Module, 50 Zeilen Code.)
Person C kommt und sagt: "Wieso willst du die Liste überhaupt verändern?
Person D kommt und sagt, das könne er ohne Kontext nicht beantworten, und wenn man ihm den Kontext gibt, gibt er einen ganzen Code für das Projekt und sagt der wäre besser.
Person E kommt und sagt er helfe dir nicht, die Variablen seien schlecht benannt, dass müsste liste1 und nicht x heißen.

Ich bin nicht perfekt, dass weiß ich.
Bin ab und zu ein ziemlicher Arsch, das weiß ich.
Aber ihr seid auch nicht immer alle perfekt *schulterzuck*

Ich kann natürlich versuchen mich zu bessern, aber man muss auch verstehen ich habe oft keine Zeit, mich gefühlte 5 Stunden in irgendne Bibliothek einzulesen, nur um dann am Ende eine einzige Methode davon zu gebrauchen. Deswegen nehm ich dann ab und zu lieber den Forumscode, schau ihn mir selber an und was er tut, und passt. Wenn ich mal wieder so ein Problem hab, schau ins alte Projekt und kopier diesen Code bzw nehm in als Grundlage.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Doch doch, der Vergleich passt schon. Denn du hast keine Ahnung, dass es einzelnes Eis gibt. Wenn man dich darauf hinweist, kriegst du den Wutanfall, krakelst “Mir egal ob Eis weggeschmissen wird, Hauptsache ich habe eins!”

Kannst du alles machen. Aber wie du ja selbst sagst: hier gibt es ein gewisses Kenntnissgefälle. Ob es eine gute Idee ist Leuten, die einem helfen sollen, mit solchem Nachdruck immer wieder den Stinkefinger zu zeigen 🤔🤷🏼‍♂️
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Und Person F (ich) würde sagen, dass du die SuFu benutzen solltest, da sowas schon oft diskutiert wurde. Zu finden hier. (Sogar mit einem externen Link wo noch mehr zu dem Thema steht)


Phobit hat geschrieben: Sonntag 19. Januar 2020, 13:15 Desweiteren mach ich meine Codes nicht "universell", also nutze den selben Code nicht für mehrere Projekte, deswegen kann er auf ein Projekt speziell spezialisiert sein.
Phobit hat geschrieben: Sonntag 19. Januar 2020, 17:51 Wenn ich mal wieder so ein Problem hab, schau ins alte Projekt und kopier diesen Code bzw nehm in als Grundlage.
Das Problem ist, dass wenn du immer wieder den "falschen" bzw. nicht den optimalsten Code aus alten Projekten nimmst, hast du in jedem neuen Projekt immer wieder den selben "Fehler".

Des weiteren: Ich habe beruflich auch mit manchen Leuten zu tun die wirklich A-Löcher sind, aber da ich beruflich auf diese Personen angewiesen bin bzw. etwas von denen haben will muss ich halt manchmal über meinem Ego stehen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Phobit hat geschrieben: Sonntag 19. Januar 2020, 13:15 "Guter Code" ist relativ. Meine Codes sind nicht OpenSource, also müssen sie nicht so klar strukturiert sein, dass sie jeder auf Anhieb versteht.
Wie du deinen Code schreibst, ist deine Sache.
Ob jemand anderes deinen Code versteht, kannst du selbst aber nicht beurteilen.
Du hast noch ganz andere bzw. keine Denkmodelle.
Und was deets oben geschrieben hat, also y = list(x) funktioniert perfekt für das, was ich brauche. Wieso sollte ich also jetzt anfangen da mords Module reinzuklatschen oder den Code statt auf 1er auf 15 Zeilen zu schreiben, wenn der simple Befehl doch perfekt ausreicht? Nur damit er am Ende schöner aussieht?
Geht es nicht darum die Sprache zu lernen?
Das wäre so, als wenn du russisch lernen willst, dich aber weigerst die unterschiedlichen Plural-Formen zu erlernen.

Das ginge auch:

Code: Alles auswählen

y = x.copy()
Oder das:

Code: Alles auswählen

y = x[:]
Oder halt eine List Comprehension:

Code: Alles auswählen

forbidden_values = (1, 2, 3)
y = [value for value in x if value not in forbidden_values]
PS: x und y sind schlechte Namen. Was ist x und was ist y?
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten