list of dictionary, erstellen durch kopieren von Referenzen

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.
loonquawl
User
Beiträge: 8
Registriert: Dienstag 16. März 2010, 16:19

Dienstag 16. März 2010, 19:47

Danke .robert.

das hatte ich schon so gemacht, trotzdem ist es ja schade, dass man jetzt nicht mehr ohne Zusatzaufwand den Inhalt von MyDatatype sieht, da bleibe ich lieber bei der ld[1]['x'] Nomenklatur.

Falls ich nicht der einzige Noob bin, der drüber stolpert:
http://old.nabble.com/Can%27t-create-li ... 86707.html fand ich sehr lesbar
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 16. März 2010, 20:21

hä?

deine Methode:

Code: Alles auswählen

ld[1]['x']
mittels eigenem datentyp:

Code: Alles auswählen

ld[1].x
stimmt, ne menge Zusatzaufwand...
:roll:
loonquawl
User
Beiträge: 8
Registriert: Dienstag 16. März 2010, 16:19

Dienstag 16. März 2010, 20:48

@ .robert: nee, nicht die einzel-Abfragen, sondern das simple print ld, hatte gehofft das das klar war. Danke der Nachfrage.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Dienstag 16. März 2010, 20:54

loonquawl hat geschrieben:sondern das simple print ld

Code: Alles auswählen

def __repr__(self):
    return (%s, %d) % (self.fname, self.x)
Edit:

beispiel:

Code: Alles auswählen

In [14]: class MyData(object):
        def __init__(self, fname, x):
            self.fname = fname
            self.x = x
        def __repr__(self):
            return self.fname
   ....:     
   ....:     

In [20]: ls = []

In [21]: ls.append(MyData('file',5))

In [22]: ls
Out[22]: [file]
(doku lesen wäre eine Maßnahme :wink: )
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Dienstag 16. März 2010, 22:30

loonquawl hat geschrieben:
Gar nicht. Was du ja wohl willst, ist eine Kopie erzeugen, und darauf dann referenzieren. Kopien einer Liste s kannst du z.B. mit s[:] erzeugen. Je nachdem was deine Liste enthaelt, muesstest du dir auch deepcopy ansehen.
... leider will ich keine Liste, sondern ein dict kopieren; s{:} funktioniert nicht, deepcopy(s) funktioniert.
deepcopy ist allerdings meistens nicht das was man will. Da auch alle Elemente kopiert werden. meist reicht ein einfaches copy.
bords0
User
Beiträge: 172
Registriert: Mittwoch 4. Juli 2007, 20:40

Dienstag 16. März 2010, 23:21

numerix hat geschrieben:Wenn er überhaupt eine Kopie braucht, dann die der Dictionaries, das geht nicht mittels Slicing, da braucht er das copy-Modul.
Geht auch ohne copy-Modul: mit d.copy() oder dict(d).
dahaze
User
Beiträge: 74
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Mittwoch 17. März 2010, 08:09

bords0 hat geschrieben:
numerix hat geschrieben:Wenn er überhaupt eine Kopie braucht, dann die der Dictionaries, das geht nicht mittels Slicing, da braucht er das copy-Modul.
Geht auch ohne copy-Modul: mit d.copy() oder dict(d).
Weden nur immutable Datentypen innhalb des Dictionaries verwendet geht das auch mit copy() bzw. dict(). Aber mit diesen Befehlen kopierst du nur die Pointerstruktur des Dictionaries und nicht die Elemente selbst!
Sobald das Dictionary mutable Datentypen ( z.B. Listen, Dicts) enthält funktionierts nicht mehr! Dann hilft nur noch ein "Deepcopy". Deshalb heisst das ja auch so! 8)

Bsp:

Code: Alles auswählen

>>> import copy
>>> d1 = {'a':[0,1],'b':1,'c':1}
>>> d2 = d1.copy()
>>> d3 = dict(d1)
>>> d4 = copy.deepcopy(d1)
>>> d1['a'][0] = 'XXX'
>>> d1['b'] = 2
>>> d1
{'a': ['XXX', 1], 'c': 1, 'b': 2}
>>> d2
{'a': ['XXX', 1], 'c': 1, 'b': 1}
>>> d3
{'a': ['XXX', 1], 'c': 1, 'b': 1}
>>> d4
{'a': [0, 1], 'c': 1, 'b': 1}
>>> 
Gruß,
dahaze
Zuletzt geändert von dahaze am Mittwoch 17. März 2010, 08:19, insgesamt 1-mal geändert.
loonquawl
User
Beiträge: 8
Registriert: Dienstag 16. März 2010, 16:19

Mittwoch 17. März 2010, 08:15

@bords0: Vielen Dank! das war sehr hilfreich.

@dahaze: Das war noch hilfreicher. Habe keine Listen im Dict, aber wäre vermutlich nur eine Frage der Zeit gewesen, bis ich in die Falle tappe...

@.robert:
(doku lesen wäre eine Maßnahme Wink )
Ist DLWEM das freundliche RTFM? :-) Jedenfalls wahr. Mein Buch ('Python' von oReilly) war aber nicht für von vorne nach hinten durchlesen gedacht, docs.python.org ist nicht für mich geschrieben (um das neutral auszudrücken) - deshalb habe ich hauptsächlich Google genutzt... man sieht ja was rauskam. Habe aber gestern mit Suchbegriffen aus diesem Thread diveintopython.org gefunden, - das ist tatsächlich sehr gute Lektüre.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 17. März 2010, 09:10

.robert hat geschrieben:(doku lesen wäre eine Maßnahme :wink: )
Also ich finde, das sollte man ihm jetzt nicht vorhalten. Er hat ein Problem geschildert, hat Lösungsvorschläge bekommen, hat die dankbar und offenbar auch mit Verstand angenommen und umgesetzt. Dann wird ihm gesagt, statt eines Dictionaries könne er ja auch einen eigenen Datentyp verwenden. Auch das nimmt er - obwohl er damit noch nicht vertraut ist und es eigentlich nicht bräuchte, weil er mit seinem dict klarkommt - auf, bemüht sich drum, stößt auf Probleme und dann so ein Satz ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Mittwoch 17. März 2010, 09:11

bords0 hat geschrieben:
numerix hat geschrieben:Wenn er überhaupt eine Kopie braucht, dann die der Dictionaries, das geht nicht mittels Slicing, da braucht er das copy-Modul.
Geht auch ohne copy-Modul: mit d.copy() oder dict(d).
Danke für den Hinweis. Ich glaube, ich habe noch nie ein Dictionary kopieren müssen ...
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 17. März 2010, 09:27

dahaze hat geschrieben: Sobald das Dictionary mutable Datentypen ( z.B. Listen, Dicts) enthält funktionierts nicht mehr! Dann hilft nur noch ein "Deepcopy".
Die Funktionsweise von copy ist in beiden Faellen gleich. Nur dass du halt bei nicht veraenderbaren Objekten nicht merkst, wenn du entgegen deiner Vorstellung mit Referenzen auf das gleiche Objekt arbeitest, weil du sie halt... nicht veraendern kannst, sondern nur neu zuweisen. Wenn du dich mit den Mutable-Objekten auch aufs neu zuweisen beschraenken wuerdest, gaeb's auch kein Problem. Mutable/Immutable-Objekte sind erstmal nicht verschieden, die Unterschiede treten auf, weil du andere Dinge mit ihen machst.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Mittwoch 17. März 2010, 09:48

dahaze hat geschrieben:Weden nur immutable Datentypen innhalb des Dictionaries verwendet geht das auch mit copy() bzw. dict(). Aber mit diesen Befehlen kopierst du nur die Pointerstruktur des Dictionaries und nicht die Elemente selbst!
Sobald das Dictionary mutable Datentypen ( z.B. Listen, Dicts) enthält funktionierts nicht mehr! Dann hilft nur noch ein "Deepcopy". Deshalb heisst das ja auch so! 8)
Das ist so pauschal erstmal falsch(s. Rebeccas Post). Was man verwendet hängt außerdem davon ab, was man haben möchte. In vielen Fällen möchte man, wie ich eben schon schrieb, tatsächlich nur das dict selbst kopieren und nicht die Elemente die dort enthalten sind. copy und deepcopy existieren weil man sie tatsächlich für verschiedene Anwendungsfälle braucht und nicht, weil es (nicht-)veränderliche Datentypen gibt.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Mittwoch 17. März 2010, 10:18

numerix hat geschrieben:
.robert hat geschrieben:(doku lesen wäre eine Maßnahme :wink: )
Also ich finde, das sollte man ihm jetzt nicht vorhalten. Er hat ein Problem geschildert, hat Lösungsvorschläge bekommen, hat die dankbar und offenbar auch mit Verstand angenommen und umgesetzt. Dann wird ihm gesagt, statt eines Dictionaries könne er ja auch einen eigenen Datentyp verwenden. Auch das nimmt er - obwohl er damit noch nicht vertraut ist und es eigentlich nicht bräuchte, weil er mit seinem dict klarkommt - auf, bemüht sich drum, stößt auf Probleme und dann so ein Satz ...
Öhm, sorry, so war das absolut nicht gemeint. Eher so:
Wirf doch auch mal einen Blick in die Doku, da stehen noch viele Interessante Sachen drin, die dir bei deinem Projekt helfen könnten! :)

Gruß,
r.
- der eigentlich alles erst mal nett und freundlich meint. Wenn nicht merkt man das schon...
dahaze
User
Beiträge: 74
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Mittwoch 17. März 2010, 15:12

@Rebecca
@Darii
Sorry, da habe ich mich wohl zu leichtfertig ausgedrückt. :cry:
Wie es zu diesen Effekten kommt ist mir wohl bewusst und natürlich kommt es auf den jeweiligen Anwendungsfall an, welche Funtion man dann benutzt.
Ich wollte lediglich darauf hinweisen, dass man "d.copy()" nicht mit "copy.deepcopy(d)" verwechselt. (Was mir persönlich anfangs passiert ist.)
Antworten