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
list of dictionary, erstellen durch kopieren von Referenzen
hä?
deine Methode:
mittels eigenem datentyp:
stimmt, ne menge Zusatzaufwand...
deine Methode:
Code: Alles auswählen
ld[1]['x']
Code: Alles auswählen
ld[1].x
loonquawl hat geschrieben:sondern das simple print ld
Code: Alles auswählen
def __repr__(self):
return (%s, %d) % (self.fname, self.x)
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]
deepcopy ist allerdings meistens nicht das was man will. Da auch alle Elemente kopiert werden. meist reicht ein einfaches copy.loonquawl hat geschrieben:... leider will ich keine Liste, sondern ein dict kopieren; s{:} funktioniert nicht, deepcopy(s) funktioniert.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.
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!bords0 hat geschrieben:Geht auch ohne copy-Modul: mit d.copy() oder dict(d).numerix hat geschrieben:Wenn er überhaupt eine Kopie braucht, dann die der Dictionaries, das geht nicht mittels Slicing, da braucht er das copy-Modul.
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!
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}
>>>
dahaze
Zuletzt geändert von dahaze am Mittwoch 17. März 2010, 08:19, insgesamt 1-mal geändert.
@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:
@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:
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.(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 ....robert hat geschrieben:(doku lesen wäre eine Maßnahme )
Danke für den Hinweis. Ich glaube, ich habe noch nie ein Dictionary kopieren müssen ...bords0 hat geschrieben:Geht auch ohne copy-Modul: mit d.copy() oder dict(d).numerix hat geschrieben:Wenn er überhaupt eine Kopie braucht, dann die der Dictionaries, das geht nicht mittels Slicing, da braucht er das copy-Modul.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
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.dahaze hat geschrieben: Sobald das Dictionary mutable Datentypen ( z.B. Listen, Dicts) enthält funktionierts nicht mehr! Dann hilft nur noch ein "Deepcopy".
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
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.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!
Öhm, sorry, so war das absolut nicht gemeint. Eher so:numerix hat geschrieben: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 ....robert hat geschrieben:(doku lesen wäre eine Maßnahme )
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...
@Rebecca
@Darii
Sorry, da habe ich mich wohl zu leichtfertig ausgedrückt.
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.)
@Darii
Sorry, da habe ich mich wohl zu leichtfertig ausgedrückt.
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.)