Unterschied operator.add / operator.iadd

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
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

mir erschließt sich der Unterschied nicht ganz:

Code: Alles auswählen

>>> a = 5
>>> operator.add(a,1)
6
>>> a
5
>>> operator.iadd(a,1)
6
>>> a
5
Bei 'operator.iadd' spricht die Doku doch von einem 'in-place' operator. Ich würde also folgendes erwarten:

Code: Alles auswählen

>>> a = 5
>>> operator.iadd(a, 1)
>>> a
6
Was macht 'iadd' also anderes als 'add'?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

guckstu:

Code: Alles auswählen

class Foo(object):
    def __init__(self, val):
        self._val = val
    def __str__(self):
        return 'Foo(%d)' % self._val
    def __add__(self, number):
        return Foo(self._val + number)
    def __iadd__(self, number):
        self._val += number
        return self

from operator import add, iadd

a = Foo(2)
print add(a, 7)
print a
print iadd(a, 7)
print a
Ergebnis:

Code: Alles auswählen

Foo(9)
Foo(2)
Foo(9)
Foo(9)
Nicht vergessen: ints sind immutable, Foos mutable. :wink:

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@pillmuncher:
Danke für das Beispiel...

Das heißt aber auch, dass 'iadd' nur dann "in place" arbeitet, wenn das Objekt auch eine '__iadd__'-Methode besitzt.
'operator.add/operator.iadd' macht also letztlich nichts anderes, als 'object.__add__/object.__iadd__' aufzurufen.

Sehe ich das richtig?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das hast du im Prinzip richtig verstanden. `operator.add` entspricht dem Aufruf von `+`, `operator.iadd` hingegen `+=`. Was genau passiert ist dann natürlich von den entsprechenden Objekten abhängig.
Das Leben ist wie ein Tennisball.
Antworten