Python’da closure’lar işlev çağrıları tarafından oluşturulurlar. Burada, makeInc
için bir çağrı yapmak inc
içerisindeki x
için bir “bağlantı” oluşturur. Her çağrı, bu işlevin yeni bir örneğini oluşturur, ancak her x örneği farklı bir bağlantıya sahiptir. Aşağıdaki örneğe bakalım:
def makeInc(x): def inc(y): # x, inc'in tanımı ile bağlantılı return y + x return inc incOne = makeInc(1) incFive = makeInc(5) incOne(5) # dönüt 6 incFive(5) # dönüt 10
Düzenli bir closure’da, iç işlev kendisini çevreleyen işlevin tüm değişkenlerini tamamen devralır. Ancak, bu yapıda, iç işlevin devralınan değişkenlerde yalnızca okuma erişimine sahiptir. Dolayısıyla bu değerlere atama yapamayacağını unutmayın.
def makeInc(x): def inc(y): # x'i değiştirmeye iznimiz yok x += y return x return inc incOne = makeInc(1) incOne(5) # UnboundLocalError: x tanımlanmadan çağrıldı
Python 3, iç içe geçmiş işlevlerle tam bir kapsama gerçekleştirmek için nonlocal
ifadesini sunar.
def makeInc(x): def inc(y): nonlocal x # x'i yeniden tanımlamak artık mümkün x += y return x return inc incOne = makeInc(1) incOne(5) # Dönüt 6