Closure

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
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Kann mir das jemand erklären. Ich dachte das wäre nur mit globalen Variablen möglich. Würde das auch mit z.B. Haskell funktionieren oder eine andere Sprache die referentially transparent ist.

Code: Alles auswählen

def closure():
    container = [0]
    def inc():
       container[0] += 1
    def get():
       return container[0]
    return inc, get
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@fail: Nested Functions können auf die Variablen ihrer übergeordneten Funktionen zugreifen, weil sie in deren Context leben. Dieser Kontext, weil er von den Unterfunktionen noch referenziert wird, überlebt auch das Ende der Überfunktion.
Die Unterfunktionen ändern nun nicht die Variable »container«, sondern das erste Element der Liste, die an »container« gebunden ist.
BlackJack

@fail: Die beiden inneren Funktionen nehmen wenn man sie zurück gibt, ihre „Umgebung” mit, dass heisst sie haben eine Referenz auf `container`, denn das ist in ihnen kein lokaler Name. In Haskell geht dieses Beispiel konkret nicht, weil `container` verändert werden kann, was bei Haskell's Datentypen ja nicht geht.

Ich würde das Beispiel hier übrigens als akademisch ansehen, denn das ist kein schöner Code, und auch wenn Closures mit Klassen und Klassen mit Closures ersetzt werden können, ist die Klasse in Python das vorgesehene Sprachmittel für so etwas. Closures wurden in Python vor der Einführung von `functools.partial()` öfter für den Einsatzzweck dieser Funktion in der Praxis eingesetzt.

So sieht das technisch in CPython aus:

Code: Alles auswählen

In [10]: inc, get = closure()

In [11]: inc.__closure__
Out[11]: (<cell at 0xb60d6224: list object at 0xb71ce20c>,)

In [12]: inc.__closure__[0].cell_contents
Out[12]: [0]
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Das sind also eigentlich keine puren funktionen mehr, da es beim mehrmaligen aufruf mit den gleichen parametern ein anderes resultat zurückgibt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

fail hat geschrieben:Das sind also eigentlich keine puren funktionen mehr, da es beim mehrmaligen aufruf mit den gleichen parametern ein anderes resultat zurückgibt.
Das sind auch uneigentlich keine. Aber worauf willst du hinaus? Python ist bekanntermaßen keine rein funktionale Programmiersprache.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

@Sirius3,Blackjack Danke ich glaube ich habe es verstanden
@Darii man hört Clojures oft im zusammenhang mit funktionalen Sprachen


Edit: :oops: Closures nicht clojures
Zuletzt geändert von fail am Mittwoch 1. Mai 2013, 18:49, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

fail hat geschrieben:@Darii man hört Clojures oft im zusammenhang mit funktionalen Sprachen
Python ist aber keine funktionale Sprache nach jedem Maßstab der halbwegs Sinn macht.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

fail hat geschrieben:@Darii man hört Clojures oft im zusammenhang mit funktionalen Sprachen
Weil Clojure nunmal ein funktionales Lisp ist ... SCNR
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cofi hat geschrieben:
fail hat geschrieben:@Darii man hört Clojures oft im zusammenhang mit funktionalen Sprachen
Weil Clojure nunmal ein funktionales Lisp ist ... SCNR
Hat auch Closures! :D
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten