Seite 1 von 1

Closure

Verfasst: Sonntag 28. April 2013, 10:15
von fail
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

Re: Closure

Verfasst: Sonntag 28. April 2013, 10:30
von Sirius3
@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.

Re: Closure

Verfasst: Sonntag 28. April 2013, 10:33
von 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]

Re: Closure

Verfasst: Sonntag 28. April 2013, 12:49
von fail
Das sind also eigentlich keine puren funktionen mehr, da es beim mehrmaligen aufruf mit den gleichen parametern ein anderes resultat zurückgibt.

Re: Closure

Verfasst: Sonntag 28. April 2013, 16:57
von Darii
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.

Re: Closure

Verfasst: Montag 29. April 2013, 19:29
von fail
@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

Re: Closure

Verfasst: Montag 29. April 2013, 19:54
von DasIch
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.

Re: Closure

Verfasst: Dienstag 30. April 2013, 08:29
von cofi
fail hat geschrieben:@Darii man hört Clojures oft im zusammenhang mit funktionalen Sprachen
Weil Clojure nunmal ein funktionales Lisp ist ... SCNR

Re: Closure

Verfasst: Mittwoch 1. Mai 2013, 12:09
von Leonidas
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