Seite 1 von 2

Verfasst: Dienstag 16. März 2010, 19:47
von loonquawl
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

Verfasst: Dienstag 16. März 2010, 20:21
von .robert
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:

Verfasst: Dienstag 16. März 2010, 20:48
von loonquawl
@ .robert: nee, nicht die einzel-Abfragen, sondern das simple print ld, hatte gehofft das das klar war. Danke der Nachfrage.

Verfasst: Dienstag 16. März 2010, 20:54
von .robert
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: )

Verfasst: Dienstag 16. März 2010, 22:30
von Darii
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.

Verfasst: Dienstag 16. März 2010, 23:21
von bords0
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).

Verfasst: Mittwoch 17. März 2010, 08:09
von dahaze
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

Verfasst: Mittwoch 17. März 2010, 08:15
von loonquawl
@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.

Verfasst: Mittwoch 17. März 2010, 09:10
von numerix
.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 ...

Verfasst: Mittwoch 17. März 2010, 09:11
von numerix
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 ...

Verfasst: Mittwoch 17. März 2010, 09:27
von Rebecca
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.

Verfasst: Mittwoch 17. März 2010, 09:48
von Darii
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.

Verfasst: Mittwoch 17. März 2010, 10:18
von .robert
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...

Verfasst: Mittwoch 17. März 2010, 15:12
von dahaze
@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.)